home *** CD-ROM | disk | FTP | other *** search
/ SuperHack / SuperHack CD.bin / CODING / SOUND / SCK_SP23.ZIP / SP32.ASM < prev    next >
Encoding:
Assembly Source File  |  1996-07-16  |  70.7 KB  |  2,440 lines

  1. ;▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒
  2. ;
  3. ; SHOCK! PLAY 32BIT VERSION BY TSC/SHOCK! [S3M]
  4. ;
  5. ;▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒
  6. ;
  7. ; SUPPORTED COMMANDS:   01 [A]  -       SET SPEED
  8. ;                       03 [C]  -       PATTERN BREAK
  9. ;                       04 [D]  -       VOLUME SLiDE
  10. ;                       04 [DF] -       FINE VOLUME SLIDE
  11. ;                       05 [E]  -       PORTAMENTO DOWN
  12. ;                       05 [EF] -       FINE PORTAMENTO DOWN
  13. ;                       05 [EE] -       EXTRA FINE PORTAMENTO DOWN
  14. ;                       06 [F]  -       PORTAMENTO UP
  15. ;                       06 [FF] -       FINE PORTAMENTO UP
  16. ;                       06 [FE] -       EXTRA FINE PORTAMENTO UP
  17. ;                       07 [G]  -       PORTA TO NOTE
  18. ;                       10 [J]  -       ARPEGGIO
  19. ;                       11 [K]  -       VIBRATO + VOLUME SLIDE
  20. ;                       12 [L]  -       PORTA TO NOTE + VOLUME SLIDE
  21. ;                       15 [O]  -       SAMPLE OFFSET
  22. ;                       17 [Q]  -       RETRIGGER NOTE
  23. ;                       19 [S8] -       SET PAN POSITION
  24. ;                       19 [SA] -       OLD STEREO EFFECT
  25. ;                       19 [SC] -       NOTE CUT
  26. ;                       19 [SD] -       NOTE DELAY
  27. ;                       20 [T]  -       SET TEMPO
  28. ;                       22 [V]  -       SET GLOBAL VOLUME
  29. ;                       24 [X]  -       SET DMP PAN
  30. ;
  31. ;▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒
  32.  
  33. .386
  34. .MODEL FLAT,C
  35. .CODE
  36.  
  37. ;▒▒▒▒▒▒ COPYRIGHT LóFASZ ▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒
  38.  
  39.         COPYRiGHT       DB      10,13,10,13,' ******************************'
  40.                         DB      '*******************************************'
  41.                         DB      '*****',10,13,' ******************* PMODE GU'
  42.                         DB      'S/S3M PLAYER 2.3 BY TSC/SHOCK! ************'
  43.                         DB      '*******',10,13,' **************************'
  44.                         DB      '*******************************************'
  45.                         DB      '*********'
  46.  
  47. ;▒▒▒▒▒▒ PUBLICS ▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒
  48.  
  49.         PUBLIC          SP_NEWINT8
  50.         PUBLIC          SP_START
  51.         PUBLIC          SP_STOP
  52.         PUBLIC          SP_SETCALLBACK
  53.         PUBLIC          SP_ACTORDER
  54.         PUBLIC          SP_ACTROW
  55.         PUBLIC          SP_ACTCHANNEL
  56.         PUBLIC          SP_SAMPLENUM
  57.         PUBLIC          SP_EFFECTNUM
  58.         PUBLIC          SP_EFFECTPAR
  59.         PUBLIC          SP_SONGLENGTH
  60.         PUBLIC          SP_SPEEDDEFAULT
  61.         PUBLIC          SP_TEMPODEFAULT
  62.         PUBLIC          SP_CHANNELS
  63.         PUBLIC          SP_GUSBASE
  64.         PUBLIC          SP_MASTERVOLUME
  65.         PUBLIC          SP_NOTE
  66.         PUBLIC          SP_SAMPLESSIZE
  67.         PUBLIC          GUSVOLUMES
  68.         PUBLIC          POLLMUSIC
  69.  
  70. ;▒▒▒▒▒▒ VARIABLES ▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒
  71.  
  72.         SP_OLDESP       DD      0
  73.         SP_MODPLACE     DD      0
  74.         SP_ROUTINE2CALL DD      0
  75.         SP_ERRORCODE    DD      0
  76.         SP_CHANNELS     DD      0
  77.         SP_NEWBREAK     DB      0
  78.         SP_NEWJUMP      DB      0
  79.         SP_BREAKFLAG    DB      0
  80.         SP_JUMPFLAG     DB      0
  81.         SP_OLDINT8      DD      0
  82.                         DW      0
  83.         SP_TEMPODEFAULT DB      7DH
  84.         SP_SPEEDDEFAULT DB      6
  85.         SP_DEFAULTPAN   DB      0
  86.         SP_TIMERNUM     DD      2982950
  87.         SP_TICK         DB      0
  88.         SP_ACTORDER     DB      255
  89.         SP_OLDORDER     DB      0
  90.         SP_DIVIDER      DD      44100
  91.         SP_ACTROW       DB      64
  92.         SP_ACTCHANNEL   DB      0
  93.         SP_ACT4096      DD      0
  94.         SP_RETRIGCOUNT  DB      32 DUP (0)
  95.         SP_EFFECTNUM    DB      32 DUP (0)
  96.         SP_EFFECTPAR    DB      32 DUP (0)
  97.         SP_EFFECTVOL    DB      32 DUP (0)
  98.         SP_NOTE         DW      32 DUP (0)
  99.         SP_LASTNOTE     DW      32 DUP (0)
  100.         SP_SAMPLENUM    DW      32 DUP (0)
  101.         SP_SAMPLEOFFSET DD      32 DUP (0)
  102.         SP_PORTASPEED   DB      32 DUP (0)
  103.         SP_NOTE2PORTATO DW      32 DUP (0)
  104.         SP_DEFAULTPANS  DB      32 DUP (0)
  105.         SP_LASTVOLSLIDE DB      32 DUP (0)
  106.         SP_LASTPORTA    DB      32 DUP (0)
  107.         SP_LASTARPEGGIO DB      32 DUP (0)
  108.  
  109. ;▒▒▒▒▒▒ ULTRASOUND VARIABLES ▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒
  110.  
  111.         SP_GUSBASE      DW      0
  112.         SP_GUSIRQ       DW      0
  113.         SP_GUSDMA       DW      0
  114.         SP_GUSMEMSIZE   DD      0
  115.         SP_SIGN         DB      128
  116.         SP_INCER        DB      0
  117.         SP_SMPADDRESS   DD      0
  118.         SP_UPLOADLENGTH DW      0
  119.         SP_GUSLOCATION  DD      0
  120.         SP_NUMVOICES    DB      14
  121.         SP_MASTERVOLUME DB      64
  122.  
  123. ;▒▒▒▒▒▒ ULTRASOUND PORTS ▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒
  124.  
  125.         SP_STATUSPORT   EQU     6
  126.         SP_SELECTVOICE  EQU     102H
  127.         SP_COMMANDPORT  EQU     103H
  128.         SP_DATALOWPORT  EQU     104H
  129.         SP_DATAHIGHPORT EQU     105H
  130.         SP_DRAMIOPORT   EQU     107H
  131.  
  132. ;▒▒▒▒▒▒ ULTRASOUND COMMANDS ▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒
  133.  
  134.         SP_SETVOICEFREQ EQU     1
  135.         SP_VOLRAMPRATE  EQU     6
  136.         SP_VOLRAMPSTART EQU     7
  137.         SP_VOLRAMPEND   EQU     8
  138.         SP_SETVOLUME    EQU     9
  139.         SP_SMPSTARTLO   EQU     10
  140.         SP_SMPSTARTHI   EQU     11
  141.         SP_VOICEBALANCE EQU     12
  142.         SP_VOICESACTIVE EQU     14
  143.         SP_DMACONTROL   EQU     41H
  144.         SP_DRAMALO      EQU     43H
  145.         SP_DRAMAHI      EQU     44H
  146.         SP_TIMERCONTROL EQU     45H
  147.         SP_SMPCONTROL   EQU     49H
  148.         SP_INITIALIZE   EQU     4CH
  149.  
  150.  
  151. ;▒▒▒▒▒▒ MESSAGES ▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒
  152.  
  153.         SP_MSG0         DB      'SP_ERROR: MODULE FORMAT UNKNOWN!$'
  154.         SP_MSG1         DB      'SP_ERROR: SELECTED SOUNDCARD NOT DETECTED!$'
  155.         SP_MSG2         DB      'SP_ERROR: INCORRECT SAMPLE TYPE!$'
  156.         SP_INI0         DB      'SP_INIT: INITIALIZING GUS',10,13,'$'
  157.         SP_INI1         DB      'SP_INIT: DUMPING SAMPLES TO GUS: $'
  158.         SP_INI2         DB      10,13,'SP_INIT: HOOKING INT 8H',10,13,'$'
  159.         SP_INI3         DB      'SP_INIT: PLAYING',10,13,'$'
  160.         SP_INI4         DB      'SP_DEINIT: STOPPING',10,13,'$'
  161.         SP_INI5         DB      'SP_DEINIT: UN-HOOKING INT 8H',10,13,'$'
  162.         SP_INI6         DB      'SP_INIT: 256K MEMORY ON BOARD',10,13,'$'
  163.         SP_INI7         DB      'SP_INIT: 512K MEMORY ON BOARD',10,13,'$'
  164.         SP_INI8         DB      'SP_INIT: 768K MEMORY ON BOARD',10,13,'$'
  165.         SP_INI9         DB      'SP_INIT: 1024K MEMORY ON BOARD',10,13,'$'
  166.         SP_INI10        DB      'SP_INIT: DOUBLING MEMORY',10,13,'$'
  167.         SP_INI11        DB      'SP_INIT: QUADRING MEMORY',10,13,'$'
  168.  
  169.         SP_MSGTABLE     DD      SP_MSG0
  170.                         DD      SP_MSG1
  171.                         DD      SP_INI0
  172.                         DD      SP_INI1
  173.                         DD      SP_INI2
  174.                         DD      SP_INI3
  175.                         DD      SP_INI4
  176.                         DD      SP_INI5
  177.                         DD      SP_MSG2
  178.                         DD      SP_INI6
  179.                         DD      SP_INI7
  180.                         DD      SP_INI8
  181.                         DD      SP_INI9
  182.                         DD      SP_INI10
  183.                         DD      SP_INI11
  184.  
  185. ;▒▒▒▒▒▒ SONG DATA ▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒
  186.  
  187.         SP_SMPLENGTHS   DW      99      DUP (0)
  188.         SP_SMPMODE      DB      99      DUP (0) ; 0: 1/1, 1: 1/2 , 2: 1/4 ...
  189.         SP_C2SPEEDS     DW      99      DUP (0)
  190.         SP_VOLUMES      DB      99      DUP (0)
  191.         SP_LOOPSTARTS   DW      99      DUP (0)
  192.         SP_LOOPLENGTHS  DW      99      DUP (0)
  193.         SP_LOOPFLAGS    DB      99      DUP (0)
  194.         SP_ORDERS       DB      256     DUP (0)
  195.         SP_INSPARA      DW      99      DUP (0)
  196.         SP_INSMEMSEGS   DD      99      DUP (0)
  197.         SP_PATTERNPARA  DW      256     DUP (0)
  198.         SP_LASTSAMPLE   DB      32      DUP (0)
  199.         SP_FREQS        DW      32      DUP (0)
  200.         GUSMUTE         DB      32      DUP (0)
  201.         GUSVOLUMES      DB      32      DUP (0)
  202.         GUSPLACES       DD      31      DUP (0)
  203.         SP_VSTART       DD      99      DUP (0)
  204.         SP_VBEGIN       DD      99      DUP (0)
  205.         SP_VEND         DD      99      DUP (0)
  206.         SP_MODE         DB      99      DUP (0)
  207.         SP_NUMOFPATTRNS DW      0
  208.         SP_SONGLENGTH   DB      0
  209.         SP_SONGL        DW      0
  210.         SP_NUMOFINST    DW      0
  211.         SP_RESTARTPOS   DB      0
  212.         SP_SAMPLESSIZE  DD      0
  213.  
  214. ;▒▒▒▒▒▒ TABLES ▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒
  215.  
  216.         GUSVOL          DW      01500H,0A0DEH,0AB52H,0B2BDH,0B87EH,0BD31H
  217.                         DW      0C12BH,0C49CH,0C7A5H,0CA5DH,0CCD2H,0CF10H
  218.                         DW      0D120H,0D309H,0D4D1H,0D67BH,0D80BH,0D984H
  219.                         DW      0DAE9H,0DC3BH,0DD7DH,0DEB0H,0DFD6H,0E0EFH
  220.                         DW      0E1FCH,0E2FFH,0E3F8H,0E4E8H,0E5D0H,0E6AFH
  221.                         DW      0E788H,0E859H,0E924H,0E9E9H,0EAA9H,0EB63H
  222.                         DW      0EC18H,0ECC8H,0ED73H,0EE1AH,0EEBDH,0EF5CH
  223.                         DW      0EFF7H,0F08FH,0F123H,0F1B5H,0F242H,0F2CDH
  224.                         DW      0F356H,0F3DBH,0F45EH,0F4DEH,0F55BH,0F5D7H
  225.                         DW      0F650H,0F6C7H,0F73CH,0F7AEH,0F81FH,0F88EH
  226.                         DW      0F8FBH,0F967H,0F9D0H,0FA38H,0FA9EH,0F00CH
  227.  
  228.         PERIODTABLE     DW      27392,25856,24384,23040,21696,20480,19328
  229.                         DW      18240,17216,16256,15360,14496,13696,12928
  230.                         DW      12192,11520,10848,10240, 9664, 9120, 8608
  231.                         DW      8128, 7680, 7248, 6848, 6464, 6096, 5760
  232.                         DW      5424, 5120, 4832, 4560, 4304, 4064, 3840
  233.                         DW      3624, 3424, 3232, 3048, 2880, 2712, 2560
  234.                         DW      2416, 2280, 2152, 2032, 1920, 1812, 1712
  235.                         DW      1616, 1524, 1440, 1356, 1280, 1208, 1140
  236.                         DW      1076, 1016,  960,  906, 856,  808,  762
  237.                         DW      720,  678,  640,  604,  570,  538,  508
  238.                         DW      480,  453,  428,  404,  381,  360,  339
  239.                         DW      320,  302,  285,  269,  254,  240,  226
  240.                         DW      214,  202,  190,  180,  170,  160,  151
  241.                         DW      143,  135,  127,  120,  113,  107,  101
  242.                         DW      95,   90,   85,   80,   75,   71,   67
  243.                         DW      63,   60,   56
  244.  
  245.         SP_DIVIDERS     DD      44100,41160,38587,36317,34300,32494,30870
  246.                         DD      29400,28063,26843,25725,24696,23746,22866
  247.                         DD      22050,21289,20580,19916,19293
  248.  
  249. ;▒▒▒▒▒▒ MAIN CODE ▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒
  250.  
  251. SP_START:
  252.         MOV     EAX,[ESP+4]             ; GETTING ADDRESS OF THE MODULE
  253.         MOV     SP_MODPLACE,EAX         ; STORING IT
  254.         CALL    DETECTTYPE              ; MOD, S3M, OR.. JPG?
  255.         CALL    INITVARIABLES           ; FILLING UP RUNTIME VARIABLES
  256.         CALL    INITDIVIDERS            ; 44100... OR?
  257.         CALL    INITSAMPLES             ; READING IN SAMPLEDATA
  258.         MOV     SP_ERRORCODE,2
  259.         CALL    DEBUGMESSAGE
  260.         CALL    DETECTGUS
  261.         CALL    GUSRESET
  262.         CALL    DETECTGUSMEM
  263.         CALL    DETECTS3M2RAMSIZE
  264.         CALL    GUSSILENCER
  265.         MOV     SP_ERRORCODE,3
  266.         CALL    DEBUGMESSAGE
  267.         CALL    UPLOADSAMPLES
  268.         MOV     SP_ERRORCODE,4
  269.         CALL    DEBUGMESSAGE
  270.         CALL    INIT_IRQ8
  271.         CALL    INIT_BALANCE
  272.         MOV     SP_ERRORCODE,5
  273.         CALL    DEBUGMESSAGE
  274.         RET
  275.  
  276. SP_STOP:
  277.         MOV     SP_ERRORCODE,6
  278.         CALL    DEBUGMESSAGE
  279.         CALL    DEINIT_IRQ8
  280.         MOV     SP_ERRORCODE,7
  281.         CALL    DEBUGMESSAGE
  282.         CALL    GUSRESET
  283.         RET
  284.  
  285. SP_SETCALLBACK:
  286.         MOV     EAX,[ESP+4]
  287.         MOV     SP_ROUTINE2CALL,EAX
  288.         RET
  289.  
  290. ;▒▒▒▒▒▒ SUBCODE ▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒
  291.  
  292. INITVARIABLES:
  293.         PUSHAD
  294.         MOV     EAX,SP_MODPLACE
  295.         MOV     BX,[EAX+32]
  296.         MOV     SP_SONGL,BX             ; SONG LENGTH
  297.         MOV     BX,[EAX+34]
  298.         MOV     SP_NUMOFINST,BX         ; NUM OF INSTRUMENTS
  299.         MOV     BX,[EAX+36]
  300.         MOV     SP_NUMOFPATTRNS,BX      ; NUM OF PATTERNS
  301.         MOV     BL,[EAX+48]
  302.         MOV     SP_MASTERVOLUME,BL      ; GLOBAL VOLUME
  303.         MOV     BL,[EAX+49]
  304.         MOV     SP_SPEEDDEFAULT,BL      ; INITIAL SPEED
  305.         MOV     BL,[EAX+50]
  306.         MOV     SP_TEMPODEFAULT,BL      ; INITIAL BPM
  307.         MOV     BL,[EAX+53]
  308.         MOV     SP_DEFAULTPAN,BL        ; DEFAULT PANNING
  309.         MOV     SP_CHANNELS,0
  310.         MOV     ECX,64
  311. RE_CHS: MOV     BL,[EAX+ECX]
  312.         CMP     BL,16
  313.         JNB     NOTENABLED
  314.         INC     SP_CHANNELS             ; NUMBER OF CHANNELS
  315. NOTENABLED:
  316.         INC     ECX
  317.         CMP     ECX,64+32
  318.         JNE     RE_CHS
  319.         MOV     EDX,0
  320.         MOV     ECX,96
  321. RE_ORD: MOV     BL,[ECX+EAX]
  322.         CMP     BL,254
  323.         JAE     MARKER
  324.         MOV     SP_ORDERS[EDX],BL       ; CORRECT ORDERLIST
  325.         INC     EDX
  326. MARKER: MOVZX   EBP,WORD PTR SP_SONGL
  327.         ADD     EBP,96
  328.         INC     ECX
  329.         CMP     EBP,ECX
  330.         JNE     RE_ORD
  331.         DEC     DL
  332.         MOV     SP_SONGLENGTH,DL        ; REAL SONGLENGTH!
  333.         MOVZX   EBP,WORD PTR SP_NUMOFINST
  334.         MOV     EDX,0
  335. RE_INSP:MOV     BX,[ECX+EAX]
  336.         MOV     SP_INSPARA[EDX*2],BX    ; STORING INSTRUMENT PARAPOINTERS
  337.         ADD     ECX,2
  338.         INC     EDX
  339.         DEC     EBP
  340.         JNZ     RE_INSP
  341.         MOVZX   EBP,WORD PTR SP_NUMOFPATTRNS
  342.         MOV     EDX,0
  343. RE_PASP:MOV     BX,[ECX+EAX]
  344.         MOV     SP_PATTERNPARA[EDX*2],BX ; STORING PATTERN PARAPOINTERS
  345.         ADD     ECX,2
  346.         INC     EDX
  347.         DEC     EBP
  348.         JNZ     RE_PASP
  349.         CMP     SP_DEFAULTPAN,252
  350.         JNE     DONTREADPAN
  351.         MOV     EBP,32
  352.         MOV     EDX,0
  353. RE_PANS:MOV     BL,[ECX+EAX]
  354.         AND     BL,0FH
  355.         MOV     SP_DEFAULTPANS[EDX],BL  ; STORING DEFAULT PANNINGS
  356.         INC     ECX
  357.         INC     EDX
  358.         DEC     EBP
  359.         JNZ     RE_PANS
  360.         JMP     PANSREAD
  361. DONTREADPAN:
  362.         ADD     ECX,32                  ; WE MUST INCREMENT THIS
  363. PANSREAD:
  364.         MOV     SP_ACTORDER,255
  365.         MOV     SP_ACTROW,64
  366.         MOV     SP_ACTCHANNEL,0
  367.         MOV     SP_ACT4096,0
  368.         POPAD
  369.         RET
  370.  
  371. INITDIVIDERS:
  372.         PUSHAD
  373.         MOV     EAX,SP_CHANNELS
  374.         CMP     EAX,14
  375.         JB      ONLY_44100
  376.         SUB     EAX,14
  377.         MOV     EAX,SP_DIVIDERS[EAX*4]
  378.         MOV     SP_DIVIDER,EAX
  379.         JMP     HIGHERDIV
  380. ONLY_44100:
  381.         MOV     SP_DIVIDER,44100
  382. HIGHERDIV:
  383.         POPAD
  384.         RET
  385.  
  386. INITSAMPLES:
  387.         PUSHAD
  388.         MOV     ECX,0
  389. RESAMPLES:
  390.         MOVZX   EBX,WORD PTR SP_INSPARA[ECX*2]
  391.         SHL     EBX,4
  392.         ADD     EBX,SP_MODPLACE
  393.         MOV     AL,[EBX]
  394.         CMP     AL,1
  395.         JBE     SAMPLETYPEOK
  396.         MOV     SP_ERRORCODE,8
  397.         CALL    ERROREXIT
  398. SAMPLETYPEOK:
  399.         MOVZX   EAX,WORD PTR [EBX+14]
  400.         MOV     SP_INSMEMSEGS[ECX*4],EAX        ; WHERE IS THE SAMPLE
  401.         CMP     EAX,0
  402.         JE      ZEROBYTESAMPLE                  ; CHECK FOR 0 BYTE SAMPLES
  403.         MOV     AX,WORD PTR [EBX+16]
  404. ZEROBYTESAMPLE:
  405.         MOV     SP_SMPLENGTHS[ECX*2],AX         ; SAMPLE LENGTH
  406.         MOV     BYTE PTR SP_SMPMODE[ECX],0      ; SAMPLE MODE
  407.         MOV     AX,WORD PTR [EBX+20]
  408.         MOV     SP_LOOPSTARTS[ECX*2],AX         ; LOOP START
  409.         MOV     AX,WORD PTR [EBX+24]
  410.         MOV     SP_LOOPLENGTHS[ECX*2],AX        ; LOOP END
  411.         MOV     AL,[EBX+28]
  412.         MOV     SP_VOLUMES[ECX],AL              ; VOLUME
  413.         MOV     AL,[EBX+31]
  414.         AND     AL,1
  415.         MOV     SP_LOOPFLAGS[ECX],AL            ; LOOP FLAG
  416.         MOV     AX,WORD PTR [EBX+32]
  417.         MOV     SP_C2SPEEDS[ECX*2],AX           ; C-2 SPEED
  418.         INC     ECX
  419.         CMP     CX,SP_NUMOFINST
  420.         JNE     RESAMPLES
  421.         POPAD
  422.         RET
  423.  
  424. DETECTTYPE:
  425.         MOV     EAX,SP_MODPLACE
  426.         ADD     EAX,44
  427.         MOV     EAX,[EAX]
  428.         CMP     EAX,'MRCS'
  429.         JE      TYPE_OK
  430.         MOV     SP_ERRORCODE,0
  431.         JMP     ERROREXIT
  432. TYPE_OK:RET
  433.  
  434. UPLOADSAMPLES:
  435.         PUSHAD
  436.         MOV     SP_GUSLOCATION,0
  437.         MOV     ECX,0
  438. UPLOOP: MOV     EAX,DWORD PTR SP_INSMEMSEGS[ECX*4]
  439.         SHL     EAX,4
  440.         ADD     EAX,SP_MODPLACE
  441.         MOV     SP_SMPADDRESS,EAX
  442.         MOVZX   EAX,WORD PTR SP_SMPLENGTHS[ECX*2]
  443.         MOV     SP_UPLOADLENGTH,AX
  444.         MOV     AL,BYTE PTR SP_SMPMODE[ECX]
  445.         MOV     SP_INCER,AL
  446.         MOV     EAX,SP_GUSLOCATION
  447.         MOV     SP_VBEGIN[ECX*4],EAX            ; STORING VOICE START
  448.         MOVZX   EBX,WORD PTR SP_LOOPSTARTS[ECX*2]
  449.         ADD     EAX,EBX
  450.         MOV     SP_VSTART[ECX*4],EAX            ; STORING LOOPSTART
  451.         CMP     SP_LOOPFLAGS[ECX],1
  452.         JNE     NOLOOP
  453.         MOVZX   EAX,WORD PTR SP_LOOPLENGTHS[ECX*2]
  454.         ADD     EAX,SP_GUSLOCATION
  455.         MOV     BYTE PTR SP_MODE[ECX],01000B
  456.         JMP     STOREIT
  457. NOLOOP: MOV     EAX,SP_GUSLOCATION
  458.         MOVZX   EBX,SP_UPLOADLENGTH
  459.         ADD     EAX,EBX
  460. STOREIT:MOV     SP_VEND[ECX*4],EAX              ; STORING VOICE END
  461.         CALL    GUSUPLOAD
  462.         MOVZX   EAX,SP_UPLOADLENGTH
  463.         ADD     SP_GUSLOCATION,EAX
  464.         INC     ECX
  465.         MOV     AX,SP_NUMOFINST
  466.         CMP     CX,SP_NUMOFINST
  467.         JNE     UPLOOP
  468.         POPAD
  469.         RET
  470.  
  471. INIT_IRQ8:
  472.         PUSH    ES
  473.         MOV     AH,35H
  474.         MOV     AL,8
  475.         INT     21H
  476.         MOV     DWORD PTR [SP_OLDINT8],EBX
  477.         MOV     WORD PTR [SP_OLDINT8+4],ES      ; SAVING OLD VECTOR
  478.         POP     ES
  479.         PUSH    DS
  480.         MOV     AX,CS
  481.         MOV     DS,AX
  482.         MOV     AH,25H
  483.         MOV     AL,8
  484.         LEA     EDX,SP_NEWINT8                  ; SETTING THE NEW ONE
  485.         INT     21H
  486.         POP     DS
  487.         CALL    SETTIMERSPEED
  488.         CALL    SETTEMPODEFAULT
  489.         RET
  490.  
  491. DEINIT_IRQ8:
  492.         PUSH    DS
  493.         MOV     AH,25H
  494.         MOV     AL,8
  495.         MOV     EDX,DWORD PTR [SP_OLDINT8]
  496.         MOV     DS,WORD PTR [SP_OLDINT8+4]      ; RESTORING OLD VECTOR
  497.         INT     21H
  498.         MOV     AL,54
  499.         OUT     43H,AL
  500.         MOV     AX,0                            ; RESTORING OLD TIMERRATE
  501.         OUT     40H,AL
  502.         MOV     AL,AH
  503.         OUT     40H,AL
  504.         MOV     AL,0B6H
  505.         OUT     43H,AL
  506.         MOV     AX,533H
  507.         OUT     42H,AL
  508.         MOV     AL,AH
  509.         OUT     42H,AL
  510.         iN      AL,61H
  511.         AND     AL,0FCH
  512.         OUT     61H,AL
  513.         POP     DS
  514.         RET
  515.  
  516. INIT_BALANCE:
  517.         PUSHAD
  518.         MOV     EBP,0
  519. REBALA: MOV     ECX,64
  520.         CALL    GUSSETBALANCE
  521.         INC     EBP
  522.         MOV     ECX,192
  523.         CALL    GUSSETBALANCE
  524.         INC     EBP
  525.         CMP     EBP,32
  526.         JNE     REBALA
  527.         POPAD
  528.         RET
  529.  
  530. GUSSILENCER:
  531.         PUSHAD
  532.         MOV     EBP,0
  533. RESILE: CALL    GUSSETVOLUME
  534.         INC     EBP
  535.         CMP     EBP,32
  536.         JNE     RESILE
  537.         POPAD
  538.         RET
  539.  
  540. SETTIMERSPEED:
  541.         PUSHAD
  542.         MOV     DX,043H
  543.         MOV     AL,036H
  544.         OUT     DX,AL
  545.         MOV     DX,040H
  546.         MOV     AX,23863 ;TIMERRATE
  547.         OUT     DX,AL
  548.         SHR     AX,8
  549.         OUT     DX,AL
  550.         POPAD
  551.         RET
  552.  
  553. ;▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒ THIS ROUTINE WILL BE POLLED ▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒
  554.  
  555. SP_NEWINT8:
  556.         PUSHFD
  557.         PUSHAD
  558.         MOV     EAX,0
  559.         MOV     EBX,0
  560.         MOV     ECX,0
  561.         MOV     EDX,0
  562.         MOV     EBP,0
  563.         MOV     ESI,0
  564.         MOV     EDI,0
  565.         CALL    POLLMUSIC
  566.         CMP     SP_ROUTINE2CALL,0
  567.         JE      NOTHINGTOCALL
  568.         MOV     SP_OLDESP,ESP
  569.         CALL    [SP_ROUTINE2CALL]
  570.         MOV     ESP,SP_OLDESP
  571.  
  572. NOTHINGTOCALL:
  573.         MOV     AL,20H
  574.         OUT     20H,AL
  575.         POPAD
  576.         POPFD
  577.         iRET
  578.  
  579. ;▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒ THE MAIN ROUTINE ▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒
  580.  
  581. POLLMUSIC:
  582.         INC     SP_TICK
  583.         MOV     AL,SP_TICK
  584.         CMP     AL,SP_SPEEDDEFAULT
  585.         JNB     PROCESSNEWROW
  586.         MOV     EBP,0
  587. RE_TICK:
  588.         MOV     AL,BYTE PTR SP_EFFECTNUM[EBP]
  589.         CMP     AL,4
  590.         JE      VOLSLIDE
  591.         CMP     AL,5
  592.         JE      PORTADOWN
  593.         CMP     AL,6
  594.         JE      PORTAUP
  595.         CMP     AL,7
  596.         JE      PORTATONOTE2
  597.         CMP     AL,10
  598.         JE      ARPEGGIO
  599.         CMP     AL,11
  600.         JE      VIBRATOANDVOLUMESLIDE
  601.         CMP     AL,12
  602.         JE      PORTAANDVOLUMESLIDE
  603.         CMP     AL,17
  604.         JE      RETRIGGERNOTE
  605.         CMP     AL,19
  606.         JNE     NOSPECIAL1
  607.         MOV     AH,BYTE PTR SP_EFFECTPAR[EBP]
  608.         SHR     AH,4
  609.         CMP     AH,0CH
  610.         JE      NOTECUT
  611.         CMP     AH,0DH
  612.         JE      NOTEDELAY2
  613.  
  614. NOSPECIAL1:
  615.         ;
  616.         ;
  617.         ;
  618. SKIP_EFFECTS2:
  619.         INC     EBP
  620.         CMP     EBP,SP_CHANNELS
  621.         JNE     RE_TICK
  622.         RET
  623.  
  624. PROCESSNEWROW:
  625.         PUSHAD
  626.         MOV     SP_TICK,0
  627.         MOV     EBP,0                           ; ACTUAL CHANNEL
  628.         CALL    CLEARNOTEANDSAMPLES
  629.         CMP     SP_BREAKFLAG,1
  630.         JE      FINDNEWROW
  631.         CMP     SP_ACTROW,64
  632.         JNE     RE_ROW                          ; NO NEED TO CALC NEW OFFSET
  633.         MOV     SP_ACTROW,0                     ; AND WE GOTTA RESET THE ROWCNT
  634.         INC     SP_ACTORDER
  635.         MOV     AL,SP_ACTORDER
  636.         CMP     AL,SP_SONGLENGTH
  637.         JBE     OKLENGTH
  638.         MOV     SP_ACTORDER,0                   ; AT THE END OF THE SONG
  639. OKLENGTH:
  640.         MOV     AL,SP_ACTORDER                  ; SAVE THE ORDERPOINTER
  641.         MOV     SP_OLDORDER,AL                  ; FOR LATER CHECKING
  642.         CALL    CALCOFFSET                      ; BUT NOW, WE MUST!
  643.  
  644. RE_ROW: MOV     ESI,SP_ACT4096
  645.         LODSB                                   ; GET A BYTE
  646.         MOV     CH,AL                           ; SAVE IT FOR LATER USE
  647.         CMP     AL,0
  648.         JNE     MOREBYTES                       ; NOT THE END
  649.         MOV     AL,SP_OLDORDER
  650.         CMP     AL,SP_ACTORDER                  ; CHECKING FOR ORDER CHANGES
  651.         JE      NOORDERCHANGE                   ; [PAGE UP/DOWN IN THE PLAYER]
  652.         MOV     AL,SP_ACTORDER
  653.         MOV     SP_OLDORDER,AL
  654.         CALL    CALCOFFSET
  655.         MOV     ESI,SP_ACT4096
  656.         MOV     SP_ACTROW,255
  657. NOORDERCHANGE:
  658.         INC     SP_ACTROW
  659.         MOV     SP_ACT4096,ESI
  660.         POPAD
  661.         CMP     SP_BREAKFLAG,2
  662.         JNE     RETTENE
  663.         MOV     SP_BREAKFLAG,0
  664.         JMP     PROCESSNEWROW
  665. RETTENE:RET
  666.  
  667. MOREBYTES:
  668.         AND     AL,31
  669.         MOVZX   EBP,AL                          ; GET CHANNEL
  670.         MOV     AL,CH
  671.         AND     AL,32                           ; CHECK THAT IF THERE IS A NOTE
  672.         CMP     AL,0
  673.         JE      NOREALNOTE
  674.         LODSB
  675.         CMP     AL,254
  676.         JNB     LAMENOTE
  677.         MOVZX   EAX,AL
  678.         MOV     WORD PTR SP_NOTE[EBP*2],AX      ; WE GOT THE NOTE
  679.         CMP     AX,0
  680.         JE      LAMENOTE
  681.         MOV     SP_LASTNOTE[EBP*2],AX
  682. LAMENOTE:
  683.         LODSB
  684.         MOVZX   EAX,AL
  685.         MOV     WORD PTR SP_SAMPLENUM[EBP*2],AX ; WE GOT THE SAMPLE NUMBER
  686.         CMP     AX,0
  687.         JE      NEW0SAM
  688.         MOV     BYTE PTR SP_LASTSAMPLE[EBP],AL  ; WE STORE THIS AS THE LAST INS
  689.         MOVZX   EBX,WORD PTR SP_SAMPLENUM[EBP*2]; SETTING THE VOLUME
  690.         MOVZX   EAX,BYTE PTR SP_VOLUMES[EBX-1]
  691.         MOV     BYTE PTR GUSVOLUMES[EBP],AL     ; IN CASE WE MIGHT NOT GET A VOL
  692. NEW0SAM:
  693.         JMP     NONOTEHERE
  694. NOREALNOTE:
  695.         MOV     WORD PTR SP_NOTE[EBP*2],0       ; 254 - KEYOFF, 255 - FUCK OFF
  696.         MOV     WORD PTR SP_SAMPLENUM[EBP*2],0
  697. NONOTEHERE:
  698.         MOV     AL,CH
  699.         AND     AL,64
  700.         CMP     AL,0
  701.         JE      GOTNOVOL
  702.         LODSB                                   ; WE GOT SOME VOLUME HERE
  703.         MOV     SP_EFFECTVOL[EBP],AL
  704.         MOV     GUSVOLUMES[EBP],AL              ; AND WE MUST STORE IT
  705.         CALL    GUSSETVOLUME                    ; AND SET IT IMMEDIATELY ;)
  706.         JE      GOTVOL
  707. GOTNOVOL:
  708.         MOV     SP_EFFECTVOL[EBP],255           ; ???
  709.  
  710. GOTVOL: MOV     AL,CH
  711.         AND     AL,128
  712.         CMP     AL,0
  713.         JE      GOTNOEFFECT
  714.         LODSB
  715.         MOV     SP_EFFECTNUM[EBP],AL
  716.         LODSB
  717.         MOV     SP_EFFECTPAR[EBP],AL
  718.         JMP     GOTEFFECT
  719. GOTNOEFFECT:
  720.         MOV     SP_EFFECTNUM[EBP],0             ; NO, HERE WAS NO EFFECT ;(
  721.         MOV     SP_EFFECTPAR[EBP],0             ; NOR EFFECTPARAMETER
  722. GOTEFFECT:
  723.         MOV     SP_ACT4096,ESI
  724.         CMP     SP_BREAKFLAG,2
  725.         JE      RE_ROW
  726.  
  727.         MOV     BYTE PTR SP_RETRIGCOUNT[EBP],0
  728.         MOV     DWORD PTR SP_SAMPLEOFFSET[EBP*4],0 ; KILL PREV. SAMPLE OFFSETS
  729.         MOV     AX,WORD PTR SP_SAMPLENUM[EBP*2]
  730.         CMP     AL,0
  731.         JE      NOSAMPLEHERE
  732.         CALL    GUSSETVOLUME
  733.  
  734. NOSAMPLEHERE:
  735.         CMP     WORD PTR SP_NOTE[EBP*2],0
  736.         JE      NONOTE
  737.         ;
  738.         ;
  739. NONOTE:
  740.         MOV     AH,BYTE PTR SP_EFFECTNUM[EBP]
  741.         MOV     AL,BYTE PTR SP_EFFECTPAR[EBP]
  742.         CMP     AX,0
  743.         JE      SKIP_EFFECTS
  744.  
  745.         MOV     AL,BYTE PTR SP_EFFECTNUM[EBP]
  746.         CMP     AL,01
  747.         JE      SETSPEED
  748.         CMP     AL,03
  749.         JE      PATTERNBREAK
  750.         CMP     AL,7
  751.         JE      PORTATONOTE1
  752.         CMP     AL,15
  753.         JE      SAMPLEOFFSET
  754.         CMP     AL,20
  755.         JE      SETTEMPO
  756.         CMP     AL,19
  757.         JNE     NOSPECIAL2
  758.         MOV     AH,BYTE PTR SP_EFFECTPAR[EBP]
  759.         SHR     AH,4
  760.         CMP     AH,8
  761.         JE      SETPANPOS
  762.         CMP     AH,0AH
  763.         JE      OLDSTEREOEFFECT
  764.         CMP     AH,0DH
  765.         JE      NOTEDELAY1
  766. NOSPECIAL2:
  767.         CMP     AL,22
  768.         JE      SETGLOBALVOLUME
  769.         CMP     AL,24
  770.         JE      SETDMPPAN
  771.  
  772. SKIP_EFFECTS:
  773.         CMP     WORD PTR SP_NOTE[EBP*2],0
  774.         JE      NONOTE2
  775.         CMP     WORD PTR SP_SAMPLENUM[EBP*2],0
  776.         JE      NONOTE2
  777.         CALL    CALCFREQ
  778.         MOVZX   EBX,WORD PTR SP_SAMPLENUM[EBP*2]
  779.         DEC     EBX
  780.         CMP     EBX,-1
  781.         JNE     GOTSAMPLE
  782.         MOVZX   EBX,BYTE PTR SP_LASTSAMPLE[EBP]
  783.         DEC     EBX
  784. GOTSAMPLE:
  785.         CALL    GUSPLAYVOICE
  786. NONOTE2:JMP     RE_ROW
  787.  
  788. FINDNEWROW:
  789.         INC     SP_ACTORDER
  790.         MOV     AL,SP_ACTORDER
  791.         CMP     AL,SP_SONGLENGTH
  792.         JBE     OKLENGTH2
  793.         MOV     SP_ACTORDER,0                   ; AT THE END OF THE SONG
  794. OKLENGTH2:
  795.         CALL    CALCOFFSET
  796.         MOV     ESI,SP_ACT4096
  797.         MOV     SP_ACTROW,0
  798.         MOV     SP_BREAKFLAG,2
  799.         MOV     AL,SP_ACTROW
  800.         CMP     AL,SP_NEWBREAK
  801.         JNE     RE_ROW2
  802.         MOV     SP_ACT4096,ESI
  803.         JMP     RE_ROW
  804. RE_ROW2:
  805.         LODSB                                   ; GET A BYTE
  806.         MOV     CH,AL                           ; SAVE IT FOR LATER USE
  807.         CMP     AL,0
  808.         JNE     MOREBYTES2                      ; NOT THE END
  809.         INC     SP_ACTROW
  810.         MOV     AL,SP_ACTROW
  811.         CMP     AL,SP_NEWBREAK
  812.         JNE     RE_ROW2
  813.         MOV     SP_ACT4096,ESI
  814.         JMP     RE_ROW
  815. MOREBYTES2:
  816.         AND     AL,31
  817.         MOVZX   EBP,AL                          ; GET CHANNEL
  818.         MOV     AL,CH
  819.         AND     AL,32                           ; CHECK THAT IF THERE IS A NOTE
  820.         CMP     AL,0
  821.         JE      NOREALNOTE2
  822.         LODSB
  823.         LODSB
  824. NOREALNOTE2:
  825.         MOV     AL,CH
  826.         AND     AL,64
  827.         CMP     AL,0
  828.         JE      GOTNOVOL2
  829.         LODSB                                   ; WE GOT SOME VOLUME HERE
  830. GOTNOVOL2:
  831.         MOV     AL,CH
  832.         AND     AL,128
  833.         CMP     AL,0
  834.         JE      GOTNOEFFECT2
  835.         LODSB
  836.         LODSB
  837. GOTNOEFFECT2:
  838.         MOV     SP_ACT4096,ESI
  839.         JMP     RE_ROW2
  840.  
  841. CALCOFFSET:
  842.         PUSHAD
  843.         MOVZX   EAX,BYTE PTR SP_ACTORDER
  844.         MOVZX   EAX,BYTE PTR SP_ORDERS[EAX]
  845.         MOVZX   EAX,WORD PTR SP_PATTERNPARA[EAX*2]
  846.         SHL     EAX,4
  847.         ADD     EAX,SP_MODPLACE
  848.         ADD     EAX,2                           ; STORED THE LENGTH OF PATTERN
  849.         MOV     SP_ACT4096,EAX
  850.         POPAD
  851.         RET
  852.  
  853. CLEARNOTEANDSAMPLES:
  854.         PUSHAD
  855.         MOV     AL,0
  856.         LEA     EDI,SP_NOTE
  857.         MOV     ECX,64
  858.         REP     STOSB
  859.         LEA     EDI,SP_EFFECTNUM
  860.         MOV     ECX,32
  861.         REP     STOSB
  862.         LEA     EDI,SP_EFFECTPAR
  863.         MOV     ECX,32
  864.         REP     STOSB
  865.         LEA     EDI,SP_EFFECTVOL
  866.         MOV     ECX,32
  867.         REP     STOSB
  868.         LEA     EDI,SP_RETRIGCOUNT
  869.         MOV     ECX,32
  870.         REP     STOSB
  871.         LEA     EDI,SP_SAMPLENUM
  872.         MOV     ECX,64
  873.         REP     STOSB
  874.         POPAD
  875.         RET
  876. ;▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒ CALCULATING FREQUENCIES ▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒
  877.  
  878. CALCFREQ:
  879.         PUSHAD
  880.         MOVZX   EBX,WORD PTR SP_NOTE[EBP*2]
  881.         CMP     EBX,0
  882.         JE      NOCALCF
  883.         MOV     ECX,EBX
  884.         SHR     CL,4                    ; GET OCTAVE
  885.         SHL     BL,4
  886.         SHR     BL,4                    ; GET NOTE
  887.         MOV     EAX,12
  888.         MUL     ECX                     ; OCTAVE*12
  889.         ADD     EAX,EBX
  890.         MOVZX   EAX,WORD PTR PERIODTABLE[EAX*2]
  891.         MOV     EBX,8363
  892.         MUL     EBX
  893.         MOVZX   EBX,WORD PTR SP_SAMPLENUM[EBP*2]
  894.         DEC     EBX
  895.         CMP     EBX,-1
  896.         JNE     NOWRS
  897.         MOVZX   EBX,BYTE PTR SP_LASTSAMPLE[EBP]
  898.         DEC     EBX
  899. NOWRS:  MOVZX   EBX,WORD PTR SP_C2SPEEDS[EBX*2]
  900.         MOV     EDX,0
  901.         DIV     EBX
  902.         MOV     EBX,EAX
  903.         MOV     WORD PTR SP_FREQS[EBP*2],BX
  904.         CMP     EBX,0
  905.         JNE     OKFREQ
  906.         MOV     EBX,856                 ; SOMETHING MUST BE BUGGY IF THIS RUNS
  907. OKFREQ: MOV     EDX,0
  908.         MOV     EAX,7159090*2
  909.         DIV     EBX
  910.         SHL     EAX,9
  911.         MOV     EBX,SP_DIVIDER
  912.         SHR     EBX,1
  913.         ADD     EAX,EBX
  914.         MOV     EDX,EAX
  915.         MOVZX   EAX,AX
  916.         SHR     EDX,16
  917.         MOV     EBX,SP_DIVIDER
  918.         DIV     BX
  919.         SHL     EAX,1
  920.         MOV     CX,AX
  921.         CALL    GUSSETFREQ
  922. NOCALCF:POPAD
  923.         RET
  924.  
  925. ;▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒ COMMAND 01: SET SPEED ▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒
  926.  
  927. SETSPEED:
  928.         PUSHAD
  929.         MOV     AL,BYTE PTR SP_EFFECTPAR[EBP]
  930.         CMP     AL,0
  931.         JE      BADSPEED
  932.         MOV     SP_SPEEDDEFAULT,AL
  933. BADSPEED:
  934.         POPAD
  935.         JMP     SKIP_EFFECTS
  936.  
  937. ;▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒ COMMAND 03: PATTERN BREAK ▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒
  938.  
  939. PATTERNBREAK:
  940.         PUSHAD
  941.         CMP     SP_BREAKFLAG,1
  942.         JE      SKIPBREAK
  943.         CMP     SP_JUMPFLAG,1
  944.         JE      SKIPBREAK
  945.         MOVZX   AX,BYTE PTR SP_EFFECTPAR[EBP]
  946.         SHR     AX,4
  947.         MOV     BX,10
  948.         MUL     BX
  949.         MOV     BX,AX
  950.         MOVZX   AX,BYTE PTR SP_EFFECTPAR[EBP]
  951.         SHL     AL,4
  952.         SHR     AL,4
  953.         ADD     AX,BX
  954.         MOV     SP_NEWBREAK,AL
  955.         MOV     SP_BREAKFLAG,1
  956. SKIPBREAK:
  957.         POPAD
  958.         JMP     SKIP_EFFECTS
  959.  
  960. ;▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒ COMMAND 4: VOLUME SLIDE ▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒
  961.  
  962. VOLSLIDE:
  963.         MOV     AL,SP_EFFECTPAR[EBP]
  964.         OR      AL,AL
  965.         JNE     NEWVLS
  966.         MOV     AL,SP_LASTVOLSLIDE[EBP]
  967. NEWVLS: MOV     SP_LASTVOLSLIDE[EBP],AL
  968.         CMP     AL,0F0H
  969.         JE      VOLSLIDEUP
  970.         SHR     AL,4
  971.         OR      AL,AL
  972.         JE      VOLSLIDEDOWN
  973.         CMP     AL,0FH
  974.         JE      FINEVOLDOWN
  975. VOLSLIDEUP:
  976.         MOV     AL,SP_LASTVOLSLIDE[EBP]
  977.         TEST    AL,0FH
  978.         JNE     FINEVOLUP
  979. VOLSLIDEUP2:
  980.         SHR     AL,4
  981.         ADD     GUSVOLUMES[EBP],AL
  982.         CMP     GUSVOLUMES[EBP],40H
  983.         JB      VSUSKIP
  984.         MOV     GUSVOLUMES[EBP],40H
  985. VSUSKIP:MOV     AL,GUSVOLUMES[EBP]
  986.         CALL    GUSSETVOLUME
  987.         JMP     SKIP_EFFECTS2
  988. VOLSLIDEDOWN:
  989.         MOV     AL,SP_LASTVOLSLIDE[EBP]
  990.         AND     AL,0FH
  991.         SUB     GUSVOLUMES[EBP],AL
  992.         CMP     GUSVOLUMES[EBP],0FFH
  993.         JG      VSDSKIP
  994.         MOV     GUSVOLUMES[EBP],0
  995. VSDSKIP:MOV     AL,GUSVOLUMES[EBP]
  996.         CALL    GUSSETVOLUME
  997.         JMP     SKIP_EFFECTS2
  998.  
  999. FINEVOLDOWN:
  1000.         MOV     SP_EFFECTNUM[EBP],0
  1001.         JMP     VOLSLIDEDOWN
  1002. FINEVOLUP:
  1003.         MOV     SP_EFFECTNUM[EBP],0
  1004.         JMP     VOLSLIDEUP2
  1005.  
  1006. ;▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒ COMMAND 5: PORTAMENTO DOWN ▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒
  1007.  
  1008. PORTADOWN:
  1009.         PUSHAD
  1010.         MOVZX   AX,BYTE PTR SP_EFFECTPAR[EBP]
  1011.         MOV     BL,AL
  1012.         SHR     BL,04H
  1013.         CMP     BL,0FH
  1014.         JE      PD01
  1015.         CMP     BL,0EH
  1016.         JE      PD02
  1017.         OR      AL,AL
  1018.         JNE     PD03
  1019.         MOV     AL,SP_LASTPORTA[EBP]
  1020. PD03:   MOV     SP_LASTPORTA[EBP],AL
  1021.         SHL     AX,02H
  1022. PD04:   ADD     SP_FREQS[EBP*2],AX
  1023.         JMP     ENDPOR2N
  1024. PD01:   AND     AL,0FH
  1025.         SHL     AX,02H
  1026.         MOV     BYTE PTR SP_LASTPORTA[EBP],00H
  1027.         MOV     BYTE PTR SP_EFFECTNUM[EBP],00H
  1028.         JMP     PD04
  1029. PD02:   AND     AL,0FH
  1030.         MOV     BYTE PTR SP_LASTPORTA[EBP],00H
  1031.         MOV     BYTE PTR SP_EFFECTNUM[EBP],00H
  1032.         JMP     PD04
  1033.  
  1034. ;▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒ COMMAND 6: PORTAMENTO UP ▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒
  1035.  
  1036. PORTAUP:
  1037.         PUSHAD
  1038.         MOVZX   AX,BYTE PTR SP_EFFECTPAR[EBP]
  1039.         MOV     BL,AL
  1040.         SHR     BL,04H
  1041.         CMP     BL,0FH
  1042.         JE      PU01
  1043.         CMP     BL,0EH
  1044.         JE      PU02
  1045.         OR      AL,AL
  1046.         JNE     PU03
  1047.         MOV     AL,SP_LASTPORTA[EBP]
  1048. PU03:   MOV     SP_LASTPORTA[EBP],AL
  1049.         SHL     AX,02H
  1050. PU04:   SUB     SP_FREQS[EBP*2],AX
  1051.         JMP     ENDPOR2N
  1052. PU01:   AND     AL,0FH
  1053.         SHL     AX,02H
  1054.         MOV     BYTE PTR SP_LASTPORTA[EBP],00H
  1055.         MOV     BYTE PTR SP_EFFECTNUM[EBP],00H
  1056.         JMP     PU04
  1057. PU02:   AND     AL,0FH
  1058.         MOV     BYTE PTR SP_LASTPORTA[EBP],00H
  1059.         MOV     BYTE PTR SP_EFFECTNUM[EBP],00H
  1060.         JMP     PU04
  1061.  
  1062. ;▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒ COMMAND 07: PORTA TO NOTE ▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒
  1063.  
  1064. PORTATONOTE1:
  1065.         PUSHAD
  1066.         CMP     WORD PTR SP_NOTE[EBP*2],0
  1067.         JE      NONOTEP
  1068.         CMP     BYTE PTR SP_EFFECTPAR[EBP],0
  1069.         JE      NOPARM
  1070.         MOV     AL,BYTE PTR SP_EFFECTPAR[EBP]
  1071.         MOV     SP_PORTASPEED[EBP],AL
  1072. NOPARM: MOVZX   EBX,WORD PTR SP_NOTE[EBP*2]
  1073.         MOVZX   ECX,BX
  1074.         SHR     CL,4                    ; GET OCTAVE
  1075.         SHL     BL,4
  1076.         SHR     BL,4                    ; GET NOTE
  1077.         MOV     EAX,12
  1078.         MUL     ECX                     ; OCTAVE*12
  1079.         ADD     EAX,EBX
  1080.         MOVZX   EAX,WORD PTR PERIODTABLE[EAX*2]
  1081.         MOV     EBX,8363
  1082.         MUL     EBX
  1083.         MOVZX   EBX,WORD PTR SP_SAMPLENUM[EBP*2]
  1084.         CMP     EBX,0
  1085.         JNE     SAMPPO
  1086.         MOVZX   EBX,BYTE PTR SP_LASTSAMPLE[EBP]
  1087. SAMPPO: DEC     EBX
  1088.         MOVZX   EBX,WORD PTR SP_C2SPEEDS[EBX*2]
  1089.         MOV     EDX,0
  1090.         DIV     EBX
  1091.         MOV     WORD PTR SP_NOTE2PORTATO[EBP*2],AX
  1092. NONOTEP:POPAD
  1093.         JMP     NONOTE2
  1094.  
  1095. PORTATONOTE2:
  1096.         PUSHAD
  1097.         MOVZX   EBX,BYTE PTR SP_PORTASPEED[EBP]
  1098.         SHL     EBX,2
  1099.         MOV     AX,WORD PTR SP_NOTE2PORTATO[EBP*2]
  1100.         CMP     AX,WORD PTR SP_FREQS[EBP*2]
  1101.         JA      ADDNOTE
  1102.         CMP     WORD PTR SP_FREQS[EBP*2],BX
  1103.         JAE     P001
  1104.         MOV     BX,WORD PTR SP_NOTE2PORTATO[EBP*2]
  1105.         MOV     WORD PTR SP_FREQS[EBP*2],BX
  1106. P001:   SUB     WORD PTR SP_FREQS[EBP*2],BX
  1107.         MOV     BX,WORD PTR SP_FREQS[EBP*2]
  1108.         CMP     BX,WORD PTR SP_NOTE2PORTATO[EBP*2]
  1109.         JA      ENDPOR2N
  1110.         MOV     BX,WORD PTR SP_NOTE2PORTATO[EBP*2]
  1111.         MOV     WORD PTR SP_FREQS[EBP*2],BX
  1112.         JMP     ENDPOR2N
  1113. ADDNOTE:ADD     WORD PTR SP_FREQS[EBP*2],BX
  1114.         MOV     BX,WORD PTR SP_FREQS[EBP*2]
  1115.         CMP     BX,WORD PTR SP_NOTE2PORTATO[EBP*2]
  1116.         JB      ENDPOR2N
  1117.         MOV     BX,WORD PTR SP_NOTE2PORTATO[EBP*2]
  1118.         MOV     WORD PTR SP_FREQS[EBP*2],BX
  1119. ENDPOR2N:
  1120.         MOVZX   EBX,WORD PTR SP_FREQS[EBP*2]
  1121.         CMP     EBX,0
  1122.         JNE     OKFREQ2
  1123.         MOV     EBX,856                 ; SOMETHING MUST BE BUGGY IF THIS RUNS
  1124. OKFREQ2:MOV     EDX,0
  1125.         MOV     EAX,7159090*2
  1126.         DIV     EBX
  1127.         SHL     EAX,9
  1128.         MOV     EBX,SP_DIVIDER
  1129.         SHR     EBX,1
  1130.         ADD     EAX,EBX
  1131.         MOV     EDX,EAX
  1132.         MOVZX   EAX,AX
  1133.         SHR     EDX,16
  1134.         MOV     EBX,SP_DIVIDER
  1135.         DIV     BX
  1136.         SHL     EAX,1
  1137.         MOV     CX,AX
  1138.         CALL    GUSSETFREQ
  1139.         POPAD
  1140.         JMP     SKIP_EFFECTS2
  1141.  
  1142. ;▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒ COMMAND 11: VIRATO AND VOLUME SLIDE ▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒
  1143.  
  1144. VIBRATOANDVOLUMESLIDE:
  1145.         MOV     AL,SP_EFFECTPAR[EBP]
  1146.         OR      AL,AL
  1147.         JNE     MEWVLS2
  1148.         MOV     AL,SP_LASTVOLSLIDE[EBP]
  1149. MEWVLS2:MOV     SP_LASTVOLSLIDE[EBP],AL
  1150.         CMP     AL,0F0H
  1151.         JE      MOLSLIDEUP23
  1152.         SHR     AL,4
  1153.         OR      AL,AL
  1154.         JE      MOLSLIDEDOWN2
  1155.         CMP     AL,0FH
  1156.         JE      MINEVOLDOWN2
  1157. MOLSLIDEUP23:
  1158.         MOV     AL,SP_LASTVOLSLIDE[EBP]
  1159.         TEST    AL,0FH
  1160.         JNE     MINEVOLUP2
  1161. MOLSLIDEUP22:
  1162.         SHR     AL,4
  1163.         ADD     GUSVOLUMES[EBP],AL
  1164.         CMP     GUSVOLUMES[EBP],40H
  1165.         JB      MSUSKIP2
  1166.         MOV     GUSVOLUMES[EBP],40H
  1167. MSUSKIP2:
  1168.         MOV     AL,GUSVOLUMES[EBP]
  1169.         CALL    GUSSETVOLUME
  1170.         JMP     SKIP_EFFECTS2
  1171. MOLSLIDEDOWN2:
  1172.         MOV     AL,SP_LASTVOLSLIDE[EBP]
  1173.         AND     AL,0FH
  1174.         SUB     GUSVOLUMES[EBP],AL
  1175.         CMP     GUSVOLUMES[EBP],0FFH
  1176.         JG      MSDSKIP2
  1177.         MOV     GUSVOLUMES[EBP],0
  1178. MSDSKIP2:
  1179.         MOV     AL,GUSVOLUMES[EBP]
  1180.         CALL    GUSSETVOLUME
  1181.         JMP     SKIP_EFFECTS2
  1182. MINEVOLDOWN2:
  1183.         MOV     SP_EFFECTNUM[EBP],0
  1184.         JMP     MOLSLIDEDOWN2
  1185. MINEVOLUP2:
  1186.         MOV     SP_EFFECTNUM[EBP],0
  1187.         JMP     MOLSLIDEUP22
  1188.  
  1189. ;▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒ COMMAND 12: PORTA TO NOTE AND VOLUME SLIDE ▒▒▒▒▒▒▒▒▒▒
  1190.  
  1191. PORTAANDVOLUMESLIDE:
  1192.         MOV     AL,SP_EFFECTPAR[EBP]
  1193.         OR      AL,AL
  1194.         JNE     NEWVLS2
  1195.         MOV     AL,SP_LASTVOLSLIDE[EBP]
  1196. NEWVLS2:MOV     SP_LASTVOLSLIDE[EBP],AL
  1197.         CMP     AL,0F0H
  1198.         JE      VOLSLIDEUP23
  1199.         SHR     AL,4
  1200.         OR      AL,AL
  1201.         JE      VOLSLIDEDOWN2
  1202.         CMP     AL,0FH
  1203.         JE      FINEVOLDOWN2
  1204. VOLSLIDEUP23:
  1205.         MOV     AL,SP_LASTVOLSLIDE[EBP]
  1206.         TEST    AL,0FH
  1207.         JNE     FINEVOLUP2
  1208. VOLSLIDEUP22:
  1209.         SHR     AL,4
  1210.         ADD     GUSVOLUMES[EBP],AL
  1211.         CMP     GUSVOLUMES[EBP],40H
  1212.         JB      VSUSKIP2
  1213.         MOV     GUSVOLUMES[EBP],40H
  1214. VSUSKIP2:
  1215.         MOV     AL,GUSVOLUMES[EBP]
  1216.         CALL    GUSSETVOLUME
  1217.         JMP     PORTATONOTE2
  1218. VOLSLIDEDOWN2:
  1219.         MOV     AL,SP_LASTVOLSLIDE[EBP]
  1220.         AND     AL,0FH
  1221.         SUB     GUSVOLUMES[EBP],AL
  1222.         CMP     GUSVOLUMES[EBP],0FFH
  1223.         JG      VSDSKIP2
  1224.         MOV     GUSVOLUMES[EBP],0
  1225. VSDSKIP2:
  1226.         MOV     AL,GUSVOLUMES[EBP]
  1227.         CALL    GUSSETVOLUME
  1228.         JMP     PORTATONOTE2
  1229.  
  1230. FINEVOLDOWN2:
  1231.         MOV     SP_EFFECTNUM[EBP],0
  1232.         JMP     VOLSLIDEDOWN2
  1233. FINEVOLUP2:
  1234.         MOV     SP_EFFECTNUM[EBP],0
  1235.         JMP     VOLSLIDEUP22
  1236.  
  1237. ;▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒ COMMAND 15: ARPEGGIO ▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒
  1238.  
  1239. ARPEGGIO:
  1240.         PUSHAD
  1241.         MOVZX   EAX,BYTE PTR SP_EFFECTPAR[EBP]
  1242.         CMP     EAX,0
  1243.         JNE     ARP01
  1244.         MOV     AL,SP_LASTARPEGGIO[EBP]
  1245. ARP01:  MOV     SP_LASTARPEGGIO[EBP],AL
  1246.         MOV     AL,SP_TICK
  1247. ARP03:  CMP     AL,03H
  1248.         JBE     ARP02
  1249.         SUB     AL,03H
  1250.         JMP     ARP03
  1251. ARP02:  MOV     BL,03H
  1252.         DIV     BL
  1253.         MOV     CL,AH
  1254.         MOV     AL,SP_LASTARPEGGIO[EBP]
  1255.         XOR     AH,AH
  1256.         CMP     CL,00H
  1257.         JE      ARP04
  1258.         CMP     CL,01H
  1259.         JE      ARP05
  1260.         SHL     AL,04H
  1261. ARP05:  SHR     AL,04H
  1262.         MOV     BX,WORD PTR SP_NOTE[EBP*2]
  1263.         CMP     BX,0000H
  1264.         JNE     ARP06
  1265.         MOV     CX,SP_LASTNOTE[EBP*2]
  1266.         MOV     CH,CL
  1267.         SHL     CH,04H
  1268.         SHR     CH,04H
  1269.         ADD     CH,AL
  1270.         CMP     CH,0CH
  1271.         JBE     ARP07
  1272.         ADD     AL,04H
  1273. ARP07:  ADD     AX,SP_LASTNOTE[EBP*2]
  1274.         MOV     WORD PTR SP_NOTE[EBP*2],AX
  1275.         JMP     ARP08
  1276. ARP06:  MOV     CX,BX
  1277.         MOV     CH,CL
  1278.         SHL     CH,04H
  1279.         SHR     CH,04H
  1280.         ADD     CH,AL
  1281.         CMP     CH,0CH
  1282.         JBE     ARP09
  1283.         ADD     AL,04H
  1284. ARP09:  ADD     WORD PTR SP_NOTE[EBP*2],AX
  1285. ARP08:  CALL    CALCFREQ
  1286.         MOV     WORD PTR SP_NOTE[EBP*2],BX
  1287.         JMP     ARP10
  1288. ARP04:  MOV     BX,WORD PTR SP_NOTE[EBP*2]
  1289.         MOV     AX,SP_LASTNOTE[EBP*2]
  1290.         CMP     AX,0000H
  1291.         JE      ARP10
  1292.         MOV     WORD PTR SP_NOTE[EBP*2],AX
  1293.         CALL    CALCFREQ
  1294.         MOV     WORD PTR SP_NOTE[EBP*2],BX
  1295. ARP10:  POPAD
  1296.         JMP     SKIP_EFFECTS2
  1297.  
  1298. ;▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒ COMMAND 15: SAMPLE OFFSET ▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒
  1299.  
  1300. SAMPLEOFFSET:
  1301.         PUSHAD
  1302.         MOVZX   EAX,BYTE PTR SP_EFFECTPAR[EBP]
  1303.         SHL     EAX,8
  1304.         MOVZX   EBX,SP_SAMPLENUM[EBP]
  1305.         MOVZX   EBX,BYTE PTR SP_SMPMODE[EBX]
  1306.         CMP     EBX,0
  1307.         JE      WASNOTDOUBLED
  1308.         SHR     EAX,1
  1309.         CMP     EBX,2
  1310.         JNE     WASNOTDOUBLED
  1311.         SHR     EAX,1
  1312. WASNOTDOUBLED:
  1313.         MOV     DWORD PTR SP_SAMPLEOFFSET[EBP*4],EAX
  1314.         POPAD
  1315.         JMP     SKIP_EFFECTS
  1316.  
  1317. ;▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒ COMMAND 17: RETRIGGER NOTE ▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒
  1318.  
  1319. RETRIGGERNOTE:
  1320.         PUSHAD
  1321.         MOV     AL,SP_EFFECTPAR[EBP]
  1322.         SHL     AL,04H
  1323.         SHR     AL,04H
  1324.         INC     BYTE PTR SP_RETRIGCOUNT[EBP]
  1325.         CMP     SP_RETRIGCOUNT[EBP],AL
  1326.         JNE     NORETRIGYET
  1327.         MOV     AL,SP_EFFECTPAR[EBP]
  1328.         SHR     AL,04H
  1329.         SHL     AL,04H
  1330.         CMP     AL,00H
  1331.         JE      RNOTE0
  1332.         CMP     AL,08H
  1333.         JE      RNOTE0
  1334.         CMP     AL,05H
  1335.         JA      RNOTE1
  1336.         MOV     CL,AL
  1337.         MOV     AL,01H
  1338.         DEC     CL
  1339.         SHL     AL,CL
  1340.         MOV     CL,GUSVOLUMES[EBP]
  1341.         CMP     CL,AL
  1342.         JB      RNOTE2
  1343.         SUB     GUSVOLUMES[EBP],AL
  1344.         JMP     RNOTE0
  1345. RNOTE2: MOV     BYTE PTR GUSVOLUMES[EBP],00H
  1346.         JMP     RNOTE0
  1347. RNOTE1: CMP     AL,07H
  1348.         JNE     RNOTE5
  1349.         SHR     BYTE PTR GUSVOLUMES[EBP],1
  1350.         JMP     RNOTE0
  1351. RNOTE5: CMP     AL,0FH
  1352.         JNE     RNOTE3
  1353.         CMP     BYTE PTR GUSVOLUMES[EBP],20H
  1354.         JBE     RNOTE4
  1355.         MOV     BYTE PTR GUSVOLUMES[EBP],40H
  1356.         JMP     RNOTE0
  1357. RNOTE4: SHL     BYTE PTR GUSVOLUMES[EBP],1
  1358.         JMP     RNOTE0
  1359. RNOTE3: CMP     AL,09H
  1360.         JB      RNOTE0
  1361.         CMP     AL,0DH
  1362.         JA      RNOTE0
  1363.         SUB     AL,09H
  1364.         MOV     CL,AL
  1365.         MOV     AL,01H
  1366.         SHL     AL,CL
  1367.         ADD     GUSVOLUMES[EBP],AL
  1368.         CMP     BYTE PTR GUSVOLUMES[EBP],40H
  1369.         JBE     RNOTE0
  1370.         MOV     BYTE PTR GUSVOLUMES[EBP],40H
  1371. RNOTE0: CALL    GUSSETVOLUME
  1372.         MOV     BYTE PTR SP_RETRIGCOUNT[EBP],0
  1373.         MOVZX   EBX,BYTE PTR SP_LASTSAMPLE[EBP]
  1374.         DEC     EBX
  1375.         CALL    GUSPLAYVOICE
  1376. NORETRIGYET:
  1377.         POPAD
  1378.         JMP     SKIP_EFFECTS2
  1379.  
  1380. ;▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒ COMMAND 198: SET PAN POSITION ▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒
  1381.  
  1382. SETPANPOS:
  1383.         PUSHAD
  1384.         MOVZX   EAX,BYTE PTR SP_EFFECTPAR[EBP]
  1385.         SHL     AL,4
  1386.         MOV     ECX,EAX
  1387.         CALL    GUSSETBALANCE
  1388.         POPAD
  1389.         JMP     SKIP_EFFECTS
  1390.  
  1391. ;▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒ COMMAND 19A: OLD STEREO EFFECT ▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒
  1392.  
  1393. OLDSTEREOEFFECT:
  1394.         PUSHAD
  1395.         MOVZX   EAX,BYTE PTR SP_EFFECTPAR[EBP]
  1396.         SHL     AL,4
  1397.         SHR     AL,4
  1398.         CMP     AL,0
  1399.         JNE     NOO0
  1400.         MOV     ECX,8*16
  1401.         JMP     OLDSS
  1402. NOO0:   CMP     AL,7
  1403.         JNE     NOO7
  1404.         MOV     ECX,15*16
  1405.         JMP     OLDSS
  1406. NOO7:   CMP     AL,8
  1407.         JNE     NOO8
  1408.         MOV     ECX,0
  1409.         JMP     OLDSS
  1410. NOO8:   MOV     ECX,7*16
  1411. OLDSS:  CALL    GUSSETBALANCE
  1412.         POPAD
  1413.         JMP     SKIP_EFFECTS
  1414.  
  1415. ;▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒ COMMAND 19C: NOTE CUT ▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒
  1416.  
  1417. NOTECUT:PUSHAD
  1418.         MOV     AL,SP_EFFECTPAR[EBP]
  1419.         SHL     AL,04H
  1420.         SHR     AL,04H
  1421.         CMP     AL,SP_TICK
  1422.         JNE     NOCUTYET
  1423.         MOV     BYTE PTR GUSVOLUMES[EBP],00H
  1424.         CALL    GUSSETVOLUME
  1425. NOCUTYET:
  1426.         POPAD
  1427.         JMP     SKIP_EFFECTS2
  1428.  
  1429. ;▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒ COMMAND 19D: NOTE DELAY ▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒
  1430.  
  1431. NOTEDELAY2:
  1432.         PUSHAD
  1433.         MOV     AL,SP_EFFECTPAR[EBP]
  1434.         SHL     AL,04H
  1435.         SHR     AL,04H
  1436.         CMP     AL,SP_TICK
  1437.         JNE     NOTYETDELAY
  1438.         MOV     BYTE PTR SP_EFFECTNUM[EBP],00H
  1439.         MOV     BYTE PTR SP_EFFECTPAR[EBP],00H
  1440.         CALL    CALCFREQ
  1441.         MOVZX   EBX,WORD PTR SP_SAMPLENUM[EBP*2]
  1442.         DEC     EBX
  1443.         CMP     EBX,-1
  1444.         JNE     NDJMP1
  1445.         MOVZX   EBX,BYTE PTR SP_LASTSAMPLE[EBP]
  1446.         DEC     EBX
  1447. NDJMP1: CALL    GUSPLAYVOICE
  1448. NOTYETDELAY:
  1449.         POPAD
  1450.         JMP     SKIP_EFFECTS2
  1451.  
  1452. NOTEDELAY1:
  1453.         PUSHAD
  1454.         MOV     AL,SP_EFFECTPAR[EBP]
  1455.         SHL     AL,04
  1456.         SHR     AL,04
  1457.         CMP     AL,SP_SPEEDDEFAULT
  1458.         JBE     NND1
  1459.         MOV     BYTE PTR SP_EFFECTNUM[EBP],00H
  1460.         MOV     BYTE PTR SP_EFFECTPAR[EBP],00H
  1461.         MOV     WORD PTR SP_SAMPLENUM[EBP*2],0000H
  1462.         MOV     WORD PTR SP_NOTE[EBP*2],0000H
  1463. NND1:   POPAD
  1464.         JMP     NONOTE2
  1465.  
  1466. ;▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒ COMMAND 20: SET TEMPO ▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒
  1467.  
  1468. SETTEMPO:
  1469.         PUSHAD
  1470.         MOV     AL,BYTE PTR SP_EFFECTPAR[EBP]
  1471.         CMP     AL,1FH
  1472.         JA      SETBPM
  1473.         JMP     SKIP_EFFECTS
  1474. SETBPM: MOV     AH,0
  1475.         MOV     BX,AX
  1476.         MOV     DX,WORD PTR [SP_TIMERNUM+2]
  1477.         MOV     AX,WORD PTR [SP_TIMERNUM]
  1478.         DiV     BX
  1479.         MOV     BX,AX
  1480.         CLi
  1481.         MOV     AL,00110100B
  1482.         OUT     43H,AL
  1483.         MOV     AL,BL
  1484.         OUT     40H,AL
  1485.         MOV     AL,BH
  1486.         OUT     40H,AL
  1487.         STi
  1488. END20:  POPAD
  1489.         JMP     SKIP_EFFECTS
  1490.  
  1491. SETTEMPODEFAULT:
  1492.         PUSHAD
  1493.         MOV     AL,SP_TEMPODEFAULT
  1494.         MOV     AH,0
  1495.         MOV     BX,AX
  1496.         MOV     DX,WORD PTR [SP_TIMERNUM+2]
  1497.         MOV     AX,WORD PTR [SP_TIMERNUM]
  1498.         DiV     BX
  1499.         MOV     BX,AX
  1500.         CLi
  1501.         MOV     AL,00110100B
  1502.         OUT     43H,AL
  1503.         MOV     AL,BL
  1504.         OUT     40H,AL
  1505.         MOV     AL,BH
  1506.         OUT     40H,AL
  1507.         STi
  1508.         POPAD
  1509.         RET
  1510.  
  1511. ;▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒ COMMAND 22: SET GLOBAL VOLUME ▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒
  1512.  
  1513. SETGLOBALVOLUME:
  1514.         PUSHAD
  1515.         MOV     AL,SP_EFFECTPAR[EBP]
  1516.         CMP     AL,40H
  1517.         JA      NOSETGV
  1518.         MOV     SP_MASTERVOLUME,AL
  1519.         MOV     EBP,0
  1520. SGVOLLOOP:
  1521.         CALL    GUSSETVOLUME
  1522.         INC     EBP
  1523.         CMP     EBP,20H
  1524.         JNE     SGVOLLOOP
  1525. NOSETGV:POPAD
  1526.         JMP     SKIP_EFFECTS
  1527.  
  1528. ;▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒ COMMAND 24: SET DMP PAN ▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒
  1529.  
  1530. SETDMPPAN:
  1531.         PUSHAD
  1532.         MOVZX   EAX,BYTE PTR SP_EFFECTPAR[EBP]
  1533.         MOV     ECX,EAX
  1534.         CALL    GUSSETBALANCE
  1535.         POPAD
  1536.         JMP     SKIP_EFFECTS
  1537.  
  1538. ;▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒ EXIT ROUTINES ▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒
  1539.  
  1540. ERROREXIT:
  1541.         MOV     EBX,SP_ERRORCODE
  1542.         SHL     EBX,2
  1543.         MOV     EDX,SP_MSGTABLE[EBX]
  1544.         MOV     EAX,0900H
  1545.         INT     21H
  1546.         MOV     EAX,4C00H
  1547.         INT     21H
  1548.         RET
  1549.  
  1550. DEBUGMESSAGE:
  1551.         PUSHAD
  1552.         MOV     EBX,SP_ERRORCODE
  1553.         SHL     EBX,2
  1554.         MOV     EDX,SP_MSGTABLE[EBX]
  1555.         MOV     EAX,0900H
  1556.         INT     21H
  1557.         POPAD
  1558.         RET
  1559.  
  1560. ;▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒
  1561. ;
  1562. ; Shock! Play 32bit version by Tsc/Shock!
  1563. ;
  1564. ; Gravis UltraSound Routines
  1565. ;
  1566. ;▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒
  1567.  
  1568. ;▒▒▒▒▒▒ ULTRASOUND DELAY ▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒
  1569.  
  1570. GUSDELAY:
  1571.         PUSH    DX AX
  1572.         MOV     DX,SP_GUSBASE
  1573.         ADD     DX,SP_DRAMIOPORT
  1574.         IN      AL,DX
  1575.         IN      AL,DX
  1576.         IN      AL,DX
  1577.         IN      AL,DX
  1578.         IN      AL,DX
  1579.         IN      AL,DX
  1580.         IN      AL,DX
  1581.         IN      AL,DX
  1582.         POP     AX DX
  1583.         RET
  1584.  
  1585. ;▒▒▒▒▒▒ GUSPEEK - FROM SP_GUSLOCATION - TO AL ▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒
  1586.  
  1587. GUSPEEK:MOV     DX,SP_GUSBASE
  1588.         ADD     DX,SP_COMMANDPORT
  1589.         MOV     AL,SP_DRAMALO
  1590.         OUT     DX,AL
  1591.         INC     DX
  1592.         MOV     AX,WORD PTR [SP_GUSLOCATION]
  1593.         OUT     DX,AX
  1594.         DEC     DX
  1595.         MOV     AL,SP_DRAMAHI
  1596.         OUT     DX,AL
  1597.         ADD     DX,2
  1598.         MOV     AL,BYTE PTR [SP_GUSLOCATION+2]
  1599.         OUT     DX,AL
  1600.         ADD     DX,2
  1601.         IN      AL,DX
  1602.         RET
  1603.  
  1604. ;▒▒▒▒▒▒ GUSPOKE - FROM AL - TO SP_GUSLOCATION ▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒
  1605.  
  1606. GUSPOKE:PUSHAD
  1607.         MOV     CL,AL
  1608.         MOV     DX,SP_GUSBASE
  1609.         ADD     DX,SP_COMMANDPORT
  1610.         MOV     AL,SP_DRAMALO
  1611.         OUT     DX,AL
  1612.         INC     DX
  1613.         MOV     AX,WORD PTR [SP_GUSLOCATION]
  1614.         OUT     DX,AX
  1615.         DEC     DX
  1616.         MOV     AL,SP_DRAMAHI
  1617.         OUT     DX,AL
  1618.         ADD     DX,2
  1619.         MOV     AL,BYTE PTR [SP_GUSLOCATION+2]
  1620.         OUT     DX,AL
  1621.         ADD     DX,2
  1622.         MOV     AL,CL
  1623.         OUT     DX,AL
  1624.         POPAD
  1625.         RET
  1626.  
  1627. ;▒▒▒▒▒▒ GUSUPLOAD - UPLOADS SAMPLES TO GUS RAM ▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒
  1628. ;
  1629. ;       FROM:   SP_SMPADDRESS
  1630. ;       TO:     SP_GUSLOCATION
  1631. ;       AMOUNT: SP_UPLOADLENGTH
  1632. ;       SIGN:   SP_SIGN
  1633. ;       INCER:  SP_INCER
  1634. ;
  1635. ;▒▒▒▒▒▒ GUSUPLOAD - UPLOADS SAMPLES TO GUS RAM ▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒
  1636.  
  1637. GUSUPLOAD:
  1638.         PUSHAD
  1639.         MOV     AH,2
  1640.         MOV     DL,254
  1641.         INT     21H
  1642.         POPAD
  1643.         PUSHAD
  1644.         CLI
  1645.         MOV     CX,SP_UPLOADLENGTH
  1646.         CMP     CX,0
  1647.         JE      SKIPIT
  1648.         MOV     DI,WORD PTR [SP_GUSLOCATION]
  1649.         MOV     SI,WORD PTR [SP_GUSLOCATION+2]
  1650.         MOV     EBX,SP_SMPADDRESS
  1651.         MOV     DX,SP_GUSBASE
  1652.         ADD     DX,SP_COMMANDPORT
  1653.         MOV     AL,SP_DRAMAHI
  1654.         OUT     DX,AL
  1655.         ADD     DX,2
  1656.         MOV     AX,SI
  1657.         OUT     DX,AL
  1658.         SUB     DX,2
  1659. GUSUPLOADLOOP:
  1660.         MOV     AL,SP_DRAMALO
  1661.         OUT     DX,AL
  1662.         INC     DX
  1663.         MOV     AX,DI
  1664.         OUT     DX,AX
  1665.         DEC     DX
  1666. DUMPBYTE:
  1667.         ADD     DX,4
  1668.         MOV     AL,[EBX]
  1669.         XOR     AL,SP_SIGN
  1670.         INC     EBX
  1671.         CMP     SP_INCER,0
  1672.         JE      NODOUBLEDSAMPLE
  1673.         INC     EBX
  1674.         CMP     SP_INCER,1
  1675.         JE      NOQUADREDSAMPLE
  1676.         ADD     EBX,2
  1677. NOQUADREDSAMPLE:
  1678. NODOUBLEDSAMPLE:
  1679.         OUT     DX,AL
  1680.         SUB     DX,4
  1681.         ADD     DI,1
  1682.         JNC     DUMPDOL
  1683.         INC     SI
  1684.         MOV     AL,SP_DRAMAHI
  1685.         OUT     DX,AL
  1686.         ADD     DX,2
  1687.         MOV     AX,SI
  1688.         OUT     DX,AL
  1689.         SUB     DX,2
  1690. DUMPDOL:LOOP    GUSUPLOADLOOP
  1691. SKIPIT: STI
  1692.         POPAD
  1693.         RET
  1694.  
  1695. ;▒▒▒▒▒▒ GUSRESET - RESETS THE SOUNDCARD AT THE BEGINNING ▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒
  1696.  
  1697. GUSRESET:
  1698.         PUSHAD
  1699.         CMP     SP_CHANNELS,14
  1700.         JG      NOT14
  1701.         MOV     SP_NUMVOICES,14
  1702.         JMP     ONLY14
  1703. NOT14:  MOV     EAX,SP_CHANNELS
  1704.         MOV     SP_NUMVOICES,AL
  1705. ONLY14: MOV     DX,SP_GUSBASE
  1706.         MOV     AL,2
  1707.         OUT     DX,AL
  1708.         XOR     AX,AX
  1709.         MOV     SP_GUSLOCATION,0
  1710.         CALL    GUSPOKE
  1711.         MOV     DX,SP_GUSBASE
  1712.         ADD     DX,SP_COMMANDPORT
  1713.         MOV     AL,SP_INITIALIZE
  1714.         OUT     DX,AL
  1715.         ADD     DX,2
  1716.         MOV     AL,0
  1717.         OUT     DX,AL
  1718.         MOV     ECX,10
  1719. DELAYLOOP1:
  1720.         CALL    GUSDELAY
  1721.         LOOP    DELAYLOOP1
  1722.         SUB     DX,2
  1723.         MOV     AL,SP_INITIALIZE
  1724.         OUT     DX,AL
  1725.         ADD     DX,2
  1726.         MOV     AL,1
  1727.         OUT     DX,AL
  1728.         SUB     DX,5
  1729.         MOV     AL,3
  1730.         MOV     ECX,10
  1731. DELAYLOOP2:
  1732.         CALL    GUSDELAY
  1733.         LOOP    DELAYLOOP2
  1734.         MOV     AL,0
  1735.         OUT     DX,AL
  1736.         ADD     DX,3
  1737.         MOV     AL,SP_DMACONTROL
  1738.         OUT     DX,AL
  1739.         ADD     DX,2
  1740.         MOV     AL,0
  1741.         OUT     DX,AL
  1742.         SUB     DX,2
  1743.         MOV     AL,SP_TIMERCONTROL
  1744.         OUT     DX,AL
  1745.         ADD     DX,2
  1746.         MOV     AL,0
  1747.         OUT     DX,AL
  1748.         SUB     DX,2
  1749.         MOV     AL,SP_SMPCONTROL
  1750.         OUT     DX,AL
  1751.         ADD     DX,2
  1752.         MOV     AL,0
  1753.         OUT     DX,AL
  1754.         MOV     DX,SP_GUSBASE
  1755.         ADD     DX,SP_COMMANDPORT
  1756.         MOV     AL,SP_VOICESACTIVE
  1757.         OUT     DX,AL
  1758.         ADD     DX,2
  1759.         MOV     AL,SP_NUMVOICES
  1760.         DEC     AL
  1761.         OR      AL,0C0H
  1762.         OUT     DX,AL
  1763.         MOV     DX,SP_GUSBASE
  1764.         ADD     DX,SP_STATUSPORT
  1765.         IN      AL,DX
  1766.         MOV     DX,SP_GUSBASE
  1767.         ADD     DX,SP_COMMANDPORT
  1768.         MOV     AL,SP_DMACONTROL
  1769.         OUT     DX,AL
  1770.         ADD     DX,2
  1771.         IN      AL,DX
  1772.         SUB     DX,2
  1773.         MOV     AL,49H
  1774.         OUT     DX,AL
  1775.         ADD     DX,2
  1776.         IN      AL,DX
  1777.         SUB     DX,22
  1778.         MOV     AL,8FH
  1779.         OUT     DX,AL
  1780.         ADD     DX,2
  1781.         IN      AL,DX
  1782.         MOV     ECX,32
  1783. VOICECLEARLOOP:
  1784.         MOV     DX,SP_GUSBASE
  1785.         ADD     DX,SP_SELECTVOICE
  1786.         MOV     AL,CL
  1787.         DEC     AL
  1788.         OUT     DX,AL
  1789.         INC     DX
  1790.         MOV     AL,0
  1791.         OUT     DX,AL
  1792.         ADD     DX,2
  1793.         MOV     AL,3
  1794.         OUT     DX,AL
  1795.         SUB     DX,2
  1796.         MOV     AL,0DH
  1797.         OUT     DX,AL
  1798.         ADD     DX,2
  1799.         MOV     AL,3
  1800.         OUT     DX,AL
  1801.         CALL    GUSDELAY
  1802.         LOOP    VOICECLEARLOOP
  1803.         MOV     DX,SP_GUSBASE
  1804.         ADD     DX,6
  1805.         IN      AL,DX
  1806.         MOV     DX,SP_GUSBASE
  1807.         ADD     DX,SP_COMMANDPORT
  1808.         MOV     AL,SP_DMACONTROL
  1809.         OUT     DX,AL
  1810.         ADD     DX,2
  1811.         IN      AL,DX
  1812.         SUB     DX,2
  1813.         MOV     AL,SP_SMPCONTROL
  1814.         OUT     DX,AL
  1815.         ADD     DX,2
  1816.         IN      AL,DX
  1817.         SUB     DX,2
  1818.         MOV     AL,8FH
  1819.         OUT     DX,AL
  1820.         ADD     DX,2
  1821.         IN      AL,DX
  1822.         SUB     DX,2
  1823.         MOV     AL,SP_INITIALIZE
  1824.         OUT     DX,AL
  1825.         ADD     DX,2
  1826.         MOV     AL,7
  1827.         OUT     DX,AL
  1828.         MOV     DX,SP_GUSBASE
  1829.         MOV     AL,0
  1830.         OUT     DX,AL
  1831.         POPAD
  1832.         RET
  1833.  
  1834. ;▒▒▒▒▒▒ GUSSETVOLUME - SETS A VOICE TO THE GIVEN VOLUME ▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒
  1835. ;
  1836. ;       EBP - VOICE TO CHANGE
  1837. ;       ECX - VOLUME
  1838. ;
  1839. ;▒▒▒▒▒▒ GUSSETVOLUME - SETS A VOICE TO THE GIVEN VOLUME ▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒
  1840.  
  1841. GUSSETVOLUME:
  1842.         PUSHAD
  1843.         MOVZX   ECX,BYTE PTR GUSVOLUMES[EBP]
  1844.         MOVZX   EAX,BYTE PTR SP_MASTERVOLUME
  1845.         MUL     CX
  1846.         SHR     EAX,06H
  1847.         MOV     ECX,EAX
  1848.         MOV     AL,GUSMUTE[EBP]
  1849.         CMP     AL,0
  1850.         JE      NOMUTE
  1851.         MOV     ECX,0
  1852. NOMUTE: MOV     DX,SP_GUSBASE
  1853.         ADD     DX,SP_SELECTVOICE
  1854.         MOV     EAX,EBP
  1855.         OUT     DX,AL
  1856.         INC     DX
  1857.         MOV     AL,SP_SETVOLUME
  1858.         OUT     DX,AL
  1859.         INC     DX
  1860.         SHL     ECX,1
  1861.         MOV     AX,GUSVOL[ECX]
  1862.         OUT     DX,AX
  1863.         CALL    GUSDELAY
  1864.         OUT     DX,AX
  1865.         POPAD
  1866.         RET
  1867.  
  1868. ;▒▒▒▒▒▒ GUSSETBALANCE - SETS A VOICE TO THE GIVEN BALANCE ▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒
  1869. ;
  1870. ;       EBP - VOICE TO CHANGE
  1871. ;       ECX - BALANCE
  1872. ;
  1873. ;▒▒▒▒▒▒ GUSSETBALANCE - SETS A VOICE TO THE GIVEN BALANCE ▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒
  1874.  
  1875. GUSSETBALANCE:
  1876.         PUSHAD
  1877.         MOV     DX,SP_GUSBASE
  1878.         ADD     DX,SP_SELECTVOICE
  1879.         MOV     EAX,EBP
  1880.         OUT     DX,AL
  1881.         INC     DX
  1882.         MOV     AL,SP_VOICEBALANCE
  1883.         OUT     DX,AL
  1884.         ADD     DX,2
  1885.         MOV     AL,CL
  1886.         SHR     AL,4
  1887.         OUT     DX,AL
  1888.         POPAD
  1889.         RET
  1890.  
  1891. ;▒▒▒▒▒▒ GUSSETFREQ - SETS A VOICE TO THE GIVEN FREQUENCY ▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒
  1892. ;
  1893. ;       EBP - VOICE TO CHANGE
  1894. ;       ECX - FREQUENCY
  1895. ;
  1896. ;▒▒▒▒▒▒ GUSSETFREQ - SETS A VOICE TO THE GIVEN FREQUENCY ▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒
  1897.  
  1898. GUSSETFREQ:
  1899.         PUSHAD
  1900.         MOV     DX,SP_GUSBASE
  1901.         ADD     DX,SP_SELECTVOICE
  1902.         MOV     EAX,EBP
  1903.         OUT     DX,AL
  1904.         INC     DX
  1905.         MOV     AL,SP_SETVOICEFREQ
  1906.         OUT     DX,AL
  1907.         INC     DX
  1908.         MOV     AX,CX
  1909.         OUT     DX,AX
  1910.         POPAD
  1911.         RET
  1912.  
  1913. ;▒▒▒▒▒▒ GUSSTOPVOICE - STOPS A VOICE ▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒
  1914. ;
  1915. ;       EBP - VOICE TO STOP
  1916. ;
  1917. ;▒▒▒▒▒▒ GUSSTOPVOICE - STOPS A VOICE ▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒
  1918.  
  1919. GUSSTOPVOICE2:
  1920.         PUSHAD
  1921.         MOV     DX,SP_GUSBASE
  1922.         ADD     DX,SP_SELECTVOICE
  1923.         MOV     EAX,EBP
  1924.         OUT     DX,AL
  1925.         INC     DX
  1926.         MOV     AL,0
  1927.         OUT     DX,AL
  1928.         ADD     DX,2
  1929.         MOV     AL,3
  1930.         OUT     DX,AL
  1931.         SUB     DX,2
  1932.         MOV     AL,0DH
  1933.         OUT     DX,AL
  1934.         ADD     DX,2
  1935.         MOV     AL,3
  1936.         OUT     DX,AL
  1937.         CALL    GUSDELAY
  1938.         POPAD
  1939.         RET
  1940.  
  1941. ;▒▒▒▒▒▒ GUSPLAYVOICE - PLAYS A VOICE ▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒
  1942. ;
  1943. ;       EBX - VOICE TO USE
  1944. ;       EBP - SAMPLE TO PLAY
  1945. ;
  1946. ;▒▒▒▒▒▒ GUSPLAYVOICE - PLAYS A VOICE ▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒
  1947.  
  1948. GUSPLAYVOICE:
  1949.         PUSHAD
  1950.         MOV     DX,SP_GUSBASE
  1951.         ADD     DX,SP_SELECTVOICE
  1952.         MOV     EAX,EBP
  1953.         OUT     DX,AL
  1954.         MOV     AL,0
  1955.         CALL    DORAMP
  1956.         CALL    GUSSTOPVOICE2
  1957.         MOV     DX,SP_GUSBASE
  1958.         ADD     DX,SP_SELECTVOICE
  1959.         MOV     EAX,EBP
  1960.         OUT     DX,AL
  1961.         MOV     DX,SP_GUSBASE
  1962.         ADD     DX,0103H
  1963.         MOV     AL,2
  1964.         OUT     DX,AL
  1965.         INC     DX
  1966.         MOV     AX,WORD PTR [SP_VSTART+EBX*4]
  1967.         MOV     CX,WORD PTR [SP_VSTART+2+EBX*4]
  1968.         CALL    RSHIFT
  1969.         OUT     DX,AX
  1970.         DEC     DX
  1971.         MOV     AL,3
  1972.         OUT     DX,AL
  1973.         INC     DX
  1974.         MOV     AX,WORD PTR [SP_VSTART+EBX*4]
  1975.         SHL     AX,9
  1976.         OUT     DX,AX
  1977.         DEC     DX
  1978.         MOV     AL,SP_SMPSTARTLO
  1979.         OUT     DX,AL
  1980.         INC     DX
  1981.         MOV     AX,WORD PTR [SP_VBEGIN+EBX*4]
  1982.         MOV     CX,WORD PTR [SP_VBEGIN+2+EBX*4]
  1983.         ADD     AX,WORD PTR [SP_SAMPLEOFFSET+EBP*4]
  1984.         ADC     CX,0
  1985.         CALL    RSHIFT
  1986.         OUT     DX,AX
  1987.         DEC     DX
  1988.         MOV     AL,SP_SMPSTARTHI
  1989.         OUT     DX,AL
  1990.         INC     DX
  1991.         MOV     AX,WORD PTR [SP_VBEGIN+EBX*4]
  1992.         ADD     AX,WORD PTR [SP_SAMPLEOFFSET+EBP*4]
  1993.         SHL     AX,9
  1994.         OUT     DX,AX
  1995.         DEC     DX
  1996.         MOV     AL,4
  1997.         OUT     DX,AL
  1998.         INC     DX
  1999.         MOV     AX,WORD PTR [SP_VEND+EBX*4]
  2000.         MOV     CX,WORD PTR [SP_VEND+2+EBX*4]
  2001.         CALL    RSHIFT
  2002.         OUT     DX,AX
  2003.         DEC     DX
  2004.         MOV     AL,5
  2005.         OUT     DX,AL
  2006.         INC     DX
  2007.         MOV     AX,WORD PTR [SP_VEND+EBX*4]
  2008.         SHL     AX,9
  2009.         OUT     DX,AX
  2010.         DEC     DX
  2011.         MOV     AL,0
  2012.         OUT     DX,AL
  2013.         ADD     DX,2
  2014.         MOV     AL,SP_MODE[EBX]
  2015.         OUT     DX,AL
  2016.         POPAD
  2017.         RET
  2018.  
  2019. RSHIFT: PUSH    EBX
  2020.         MOV     BX,CX
  2021.         SHR     AX,7
  2022.         SHR     CX,7
  2023.         SHL     BX,9
  2024.         OR      AX,BX
  2025.         POP     EBX
  2026.         RET
  2027.  
  2028. ;▒▒▒▒▒▒ GUSPORT DETECT ▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒
  2029. ;
  2030. ;       NO CARRY  - GUS AT SP_GUSBASE
  2031. ;
  2032. ;▒▒▒▒▒▒ GUSPORT DETECT ▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒
  2033.  
  2034. DETECTGUS:
  2035.         MOV     SP_GUSBASE,210H
  2036. TESTPRT:CALL    GUSPROBE
  2037.         JNB     FOUNDP
  2038.         ADD     SP_GUSBASE,10H
  2039.         CMP     SP_GUSBASE,270H
  2040.         JB      TESTPRT
  2041.         STC
  2042.         RET
  2043. FOUNDP: CLC
  2044.         RET
  2045.  
  2046. GUSPROBE:
  2047.         MOV     DX,SP_GUSBASE
  2048.         ADD     DX,0103H
  2049.         MOV     AL,4CH
  2050.         OUT     DX,AL
  2051.         ADD     DX,2
  2052.         MOV     AL,0
  2053.         OUT     DX,AL
  2054.         CALL    GUSDELAY
  2055.         CALL    GUSDELAY
  2056.         SUB     DX,2
  2057.         MOV     AL,4CH
  2058.         OUT     DX,AL
  2059.         ADD     DX,2
  2060.         MOV     AL,1
  2061.         OUT     DX,AL
  2062.         MOV     AX,0AAH
  2063.         MOV     BX,0
  2064.         MOV     CX,0
  2065.         PUSH    DX AX
  2066.         MOV     DX,SP_GUSBASE
  2067.         ADD     DX,103H
  2068.         MOV     AL,43H
  2069.         OUT     DX,AL
  2070.         iNC     DX
  2071.         MOV     AX,CX
  2072.         OUT     DX,AX
  2073.         DEC     DX
  2074.         MOV     AL,44H
  2075.         OUT     DX,AL
  2076.         ADD     DX,2
  2077.         MOV     AL,BL
  2078.         OUT     DX,AL
  2079.         ADD     DX,2
  2080.         POP     AX
  2081.         OUT     DX,AL
  2082.         POP     DX
  2083.         MOV     AX,055H
  2084.         MOV     BX,1
  2085.         PUSH    DX AX
  2086.         MOV     DX,SP_GUSBASE
  2087.         ADD     DX,103H
  2088.         MOV     AL,43H
  2089.         OUT     DX,AL
  2090.         iNC     DX
  2091.         MOV     AX,CX
  2092.         OUT     DX,AX
  2093.         DEC     DX
  2094.         MOV     AL,44H
  2095.         OUT     DX,AL
  2096.         ADD     DX,2
  2097.         MOV     AL,BL
  2098.         OUT     DX,AL
  2099.         ADD     DX,2
  2100.         POP     AX
  2101.         OUT     DX,AL
  2102.         POP     DX
  2103.         MOV     BX,0
  2104.         PUSH    DX
  2105.         MOV     DX,SP_GUSBASE
  2106.         ADD     DX,103H
  2107.         MOV     AL,43H
  2108.         OUT     DX,AL
  2109.         iNC     DX
  2110.         MOV     AX,CX
  2111.         OUT     DX,AX
  2112.         DEC     DX
  2113.         MOV     AL,44H
  2114.         OUT     DX,AL
  2115.         ADD     DX,2
  2116.         MOV     AL,BL
  2117.         OUT     DX,AL
  2118.         ADD     DX,2
  2119.         iN      AL,DX
  2120.         POP     DX
  2121.         PUSH    AX
  2122.         MOV     AX,0
  2123.         PUSH    DX AX
  2124.         MOV     DX,SP_GUSBASE
  2125.         ADD     DX,103H
  2126.         MOV     AL,43H
  2127.         OUT     DX,AL
  2128.         iNC     DX
  2129.         MOV     AX,CX
  2130.         OUT     DX,AX
  2131.         DEC     DX
  2132.         MOV     AL,44H
  2133.         OUT     DX,AL
  2134.         ADD     DX,2
  2135.         MOV     AL,BL
  2136.         OUT     DX,AL
  2137.         ADD     DX,2
  2138.         POP     AX
  2139.         OUT     DX,AL
  2140.         POP     DX
  2141.         SUB     DX,2
  2142.         MOV     AL,4CH
  2143.         OUT     DX,AL
  2144.         ADD     DX,2
  2145.         MOV     AL,0
  2146.         OUT     DX,AL
  2147.         POP     AX
  2148.         CMP     AL,0AAH
  2149.         JNZ     NOFOUND
  2150.         CLC
  2151.         RET
  2152. NOFOUND:STC
  2153.         RET
  2154.  
  2155. ;▒▒▒▒▒▒ GUS MEMORY SIZE DETECTION ▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒
  2156.  
  2157. DETECTGUSMEM:
  2158.         PUSHAD
  2159.         MOV     DWORD PTR SP_GUSLOCATION,800*1024
  2160.         MOV     AL,0FCH
  2161.         CALL    GUSPOKE
  2162.         CALL    GUSPEEK
  2163.         CMP     AL,0FCH
  2164.         JNE     NO1024K
  2165.         MOV     SP_ERRORCODE,12
  2166.         CALL    DEBUGMESSAGE
  2167.         MOV     SP_GUSMEMSIZE,1024*1024
  2168.         JMP     DETECTGUSMEMEND
  2169. NO1024K:
  2170.         MOV     DWORD PTR SP_GUSLOCATION,600*1024
  2171.         MOV     AL,0FCH
  2172.         CALL    GUSPOKE
  2173.         CALL    GUSPEEK
  2174.         CMP     AL,0FCH
  2175.         JNE     NO768K
  2176.         MOV     SP_ERRORCODE,11
  2177.         CALL    DEBUGMESSAGE
  2178.         MOV     SP_GUSMEMSIZE,768*1024
  2179.         JMP     DETECTGUSMEMEND
  2180. NO768K:
  2181.         MOV     DWORD PTR SP_GUSLOCATION,400*1024
  2182.         MOV     AL,0FCH
  2183.         CALL    GUSPOKE
  2184.         CALL    GUSPEEK
  2185.         CMP     AL,0FCH
  2186.         JNE     NO512K
  2187.         MOV     SP_ERRORCODE,10
  2188.         CALL    DEBUGMESSAGE
  2189.         MOV     SP_GUSMEMSIZE,512*1024
  2190.         JMP     DETECTGUSMEMEND
  2191. NO512K:
  2192.         MOV     SP_ERRORCODE,9
  2193.         CALL    DEBUGMESSAGE
  2194.         MOV     SP_GUSMEMSIZE,256*1024
  2195.  
  2196. DETECTGUSMEMEND:
  2197.         POPAD
  2198.         RET
  2199.  
  2200. ;▒▒▒▒▒▒ THIS ROUTINE DECIDES WHETHER WE SHOULD DOUBLE THE DRAM OR NOT? ▒▒▒▒▒▒▒▒
  2201.  
  2202. DETECTS3M2RAMSIZE:
  2203.         PUSHAD
  2204.         MOV     SP_SAMPLESSIZE,0
  2205.         MOV     ECX,0
  2206. UPLOOPTEST:
  2207.         MOVZX   EAX,WORD PTR SP_SMPLENGTHS[ECX*2]
  2208.         ADD     SP_SAMPLESSIZE,EAX
  2209.         INC     ECX                             ; COUNTING SIZE OF S3M
  2210.         MOV     AX,SP_NUMOFINST
  2211.         CMP     CX,SP_NUMOFINST
  2212.         JNE     UPLOOPTEST
  2213.         MOV     EAX,SP_SAMPLESSIZE
  2214.         CMP     EAX,SP_GUSMEMSIZE               ; IS DOUBLING NEEDED ?
  2215.         JBE     NODOUBLEMEMORY
  2216.         MOV     SP_ERRORCODE,13                 ; YES, YES YES
  2217.         CALL    DEBUGMESSAGE
  2218.         MOV     EBP,0
  2219. DOUBLINGLOOP1:
  2220.         CMP     BP,SP_NUMOFINST
  2221.         JA      ALLDOUBLED
  2222.         CMP     WORD PTR SP_SMPLENGTHS[EBP*2],10000
  2223.         JBE     NOBIGSAMPLE
  2224.         MOV     BYTE PTR SP_SMPMODE[EBP],1
  2225.         MOVZX   EAX,WORD PTR SP_SMPLENGTHS[EBP*2] ; HALVING SAMPLE LENGTH
  2226.         SHR     EAX,1
  2227.         MOV     WORD PTR SP_SMPLENGTHS[EBP*2],AX
  2228.         MOVZX   EAX,WORD PTR SP_LOOPSTARTS[EBP*2] ; HALVING SAMPLE LOOPSTART
  2229.         SHR     EAX,1
  2230.         MOV     WORD PTR SP_LOOPSTARTS[EBP*2],AX
  2231.         MOVZX   EAX,WORD PTR SP_LOOPLENGTHS[EBP*2] ; HALVING SAMPLE LOOPSTART
  2232.         SHR     EAX,1
  2233.         MOV     WORD PTR SP_LOOPLENGTHS[EBP*2],AX
  2234.         MOVZX   EAX,WORD PTR SP_C2SPEEDS[EBP*2] ; HALVING SAMPLE FREQUENCY
  2235.         SHR     EAX,1
  2236.         MOV     WORD PTR SP_C2SPEEDS[EBP*2],AX
  2237.         CALL    COUNTAGAIN
  2238.         MOV     EAX,SP_SAMPLESSIZE
  2239.         CMP     EAX,SP_GUSMEMSIZE               ; IS DOUBLING NEEDED ?
  2240.         JBE     NODOUBLEMEMORY
  2241. NOBIGSAMPLE:
  2242.         INC     EBP
  2243.         JMP     DOUBLINGLOOP1
  2244. ALLDOUBLED:
  2245.         MOV     EBP,0
  2246. DOUBLINGLOOP2:                                    ; SECOND LOOP FOR SMALL
  2247.         CMP     BP,SP_NUMOFINST                   ; SAMPLES TOO...
  2248.         JA      ALLDOUBLED2
  2249.         CMP     WORD PTR SP_SMPLENGTHS[EBP*2],10000
  2250.         JA      BIGSAMPLE
  2251.         MOV     BYTE PTR SP_SMPMODE[EBP],1
  2252.         MOVZX   EAX,WORD PTR SP_SMPLENGTHS[EBP*2] ; HALVING SAMPLE LENGTH
  2253.         SHR     EAX,1
  2254.         MOV     WORD PTR SP_SMPLENGTHS[EBP*2],AX
  2255.         MOVZX   EAX,WORD PTR SP_LOOPSTARTS[EBP*2] ; HALVING SAMPLE LOOPSTART
  2256.         SHR     EAX,1
  2257.         MOV     WORD PTR SP_LOOPSTARTS[EBP*2],AX
  2258.         MOVZX   EAX,WORD PTR SP_LOOPLENGTHS[EBP*2] ; HALVING SAMPLE LOOPSTART
  2259.         SHR     EAX,1
  2260.         MOV     WORD PTR SP_LOOPLENGTHS[EBP*2],AX
  2261.         MOVZX   EAX,WORD PTR SP_C2SPEEDS[EBP*2] ; HALVING SAMPLE FREQUENCY
  2262.         SHR     EAX,1
  2263.         MOV     WORD PTR SP_C2SPEEDS[EBP*2],AX
  2264.         CALL    COUNTAGAIN
  2265.         MOV     EAX,SP_SAMPLESSIZE
  2266.         CMP     EAX,SP_GUSMEMSIZE               ; IS DOUBLING NEEDED ?
  2267.         JBE     NODOUBLEMEMORY
  2268. BIGSAMPLE:
  2269.         INC     EBP
  2270.         JMP     DOUBLINGLOOP2
  2271. ALLDOUBLED2:
  2272.         MOV     SP_ERRORCODE,14                 ; QUADRINGMESSAGE
  2273.         CALL    DEBUGMESSAGE
  2274.         MOV     EBP,0
  2275. QUADRINGLOOP:
  2276.         CMP     BP,SP_NUMOFINST
  2277.         JA      ALLQUADRED                      ; KINDA WEIRD CASE...
  2278.         MOV     BYTE PTR SP_SMPMODE[EBP],2
  2279.         MOVZX   EAX,WORD PTR SP_SMPLENGTHS[EBP*2]
  2280.         SHR     EAX,1
  2281.         MOV     WORD PTR SP_SMPLENGTHS[EBP*2],AX
  2282.         MOVZX   EAX,WORD PTR SP_LOOPSTARTS[EBP*2] ; HALVING SAMPLE LOOPSTART
  2283.         SHR     EAX,1
  2284.         MOV     WORD PTR SP_LOOPSTARTS[EBP*2],AX
  2285.         MOVZX   EAX,WORD PTR SP_LOOPLENGTHS[EBP*2] ; HALVING SAMPLE LOOPSTART
  2286.         SHR     EAX,1
  2287.         MOV     WORD PTR SP_LOOPLENGTHS[EBP*2],AX
  2288.         MOVZX   EAX,WORD PTR SP_C2SPEEDS[EBP*2] ; HALVING SAMPLE FREQUENCY
  2289.         SHR     EAX,1
  2290.         MOV     WORD PTR SP_C2SPEEDS[EBP*2],AX
  2291.         CALL    COUNTAGAIN
  2292.         MOV     EAX,SP_SAMPLESSIZE
  2293.         CMP     EAX,SP_GUSMEMSIZE
  2294.         JBE     NODOUBLEMEMORY
  2295.         INC     EBP
  2296.         JMP     QUADRINGLOOP
  2297. ALLQUADRED:
  2298.  
  2299. NODOUBLEMEMORY:
  2300.         POPAD
  2301.         RET
  2302.  
  2303. COUNTAGAIN:
  2304.         PUSHAD
  2305.         MOV     SP_SAMPLESSIZE,0
  2306.         MOV     ECX,0
  2307. UPLOOPTESTAGAIN:
  2308.         MOVZX   EAX,WORD PTR SP_SMPLENGTHS[ECX*2]
  2309.         ADD     SP_SAMPLESSIZE,EAX
  2310.         INC     ECX                             ; COUNTING SIZE OF S3M
  2311.         MOV     AX,SP_NUMOFINST
  2312.         CMP     CX,SP_NUMOFINST
  2313.         JNE     UPLOOPTESTAGAIN
  2314.         POPAD
  2315.         RET
  2316.  
  2317. ;▒▒▒▒▒▒ RAMP DOWN ▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒
  2318.  
  2319. RAMPDOWN:
  2320.         PUSHAD
  2321.         MOV     DX,SP_GUSBASE
  2322.         ADD     DX,103H
  2323.         MOV     EAX,EBP
  2324.         OUT     DX,AL
  2325.         ADD     DX,2
  2326.         MOV     AL,01000011B
  2327.         OUT     DX,AL
  2328.         SUB     DX,2
  2329.         MOV     AL,89H
  2330.         OUT     DX,AL
  2331.         INC     DX
  2332.         IN      AX,DX
  2333.         MOV     BX,AX
  2334.         DEC     DX
  2335.         MOV     AL,8
  2336.         OUT     DX,AL
  2337.         ADD     DX,2
  2338.         MOV     AL,BH
  2339.         OUT     DX,AL
  2340.         SUB     DX,2
  2341.         MOV     AL,7
  2342.         OUT     DX,AL
  2343.         ADD     DX,2
  2344.         MOV     AX,1
  2345.         OUT     DX,AL
  2346.         SUB     DX,2
  2347.         MOV     AL,6
  2348.         OUT     DX,AL
  2349.         ADD     DX,2
  2350.         MOV     AL,00111111B
  2351.         OUT     DX,AL
  2352.         MOV     DX,SP_GUSBASE
  2353.         ADD     DX,103H
  2354.         MOV     AL,0DH
  2355.         OUT     DX,AL
  2356.         ADD     DX,2
  2357.         MOV     AL,01000000B
  2358.         OUT     DX,AL
  2359.         POPAD
  2360.         RET
  2361.  
  2362. DORAMP: PUSH    BX Si
  2363.         MOV     AH,0
  2364.         CMP     SP_MASTERVOLUME,0
  2365.         JZ      @@ZEROVOL
  2366.         MUL     SP_MASTERVOLUME
  2367.         iNC     AH
  2368. @@ZEROVOL:
  2369.         MOV     BL,AH
  2370.         MOVZX   EBX,BL
  2371.         SHL     BX,1
  2372.         MOV     AX,WORD PTR GUSVOL[EBX*2]
  2373.         JMP     SLiDERAMP2
  2374. SLiDERAMP:
  2375.         PUSH    BX Si
  2376. SLiDERAMP2:
  2377.         MOV     Si,AX
  2378.         MOV     DX,SP_GUSBASE
  2379.         ADD     DX,SP_COMMANDPORT
  2380.         MOV     AL,0DH
  2381.         OUT     DX,AL
  2382.         ADD     DL,2
  2383.         MOV     AL,3
  2384.         OUT     DX,AL
  2385.         SUB     DL,2
  2386.         MOV     AL,89H
  2387.         OUT     DX,AL
  2388.         iNC     DX
  2389.         iN      AX,DX
  2390.         PUSH    Si
  2391.         PUSH    AX
  2392.         SHR     AX,8
  2393.         SHR     Si,8
  2394.         CMP     AX,Si
  2395.         JZ      @@DONE2
  2396.         JB      @@OK
  2397.         XCHG    Si,AX
  2398. @@OK:   PUSH    AX
  2399.         MOV     DX,SP_GUSBASE
  2400.         ADD     DX,SP_COMMANDPORT
  2401.         MOV     AL,7
  2402.         OUT     DX,AL
  2403.         ADD     DX,2
  2404.         POP     AX
  2405.         OUT     DX,AL
  2406.         MOV     DX,SP_GUSBASE
  2407.         ADD     DX,SP_COMMANDPORT
  2408.         MOV     AL,8
  2409.         OUT     DX,AL
  2410.         ADD     DX,2
  2411.         MOV     AX,Si
  2412.         OUT     DX,AL
  2413.         MOV     DX,SP_GUSBASE
  2414.         ADD     DX,SP_COMMANDPORT
  2415.         MOV     AL,6
  2416.         OUT     DX,AL
  2417.         ADD     DX,2
  2418.         MOV     AL,00111111B
  2419.         OUT     DX,AL
  2420.         MOV     BL,00000000B
  2421.         POP     AX
  2422.         POP     Si
  2423.         CMP     AX,Si
  2424.         JB      @@OK2
  2425.         OR      BL,01000000B
  2426. @@OK2:
  2427.         MOV     DX,SP_GUSBASE
  2428.         ADD     DX,SP_COMMANDPORT
  2429.         MOV     AL,0DH
  2430.         OUT     DX,AL
  2431.         ADD     DX,2
  2432.         MOV     AL,BL
  2433.         OUT     DX,AL
  2434.         JMP     @@DONE
  2435. @@DONE2:POP     AX AX
  2436. @@DONE: POP     Si BX
  2437.         RET
  2438.  
  2439.         END
  2440.